我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中断其它线程,进入信号处理函数。
请问我这样理解对不对?
还有比如read函数返回值,在linux下假如read出错,还需判断错误代码是不是EINTR,防止中断错误。
那么windows下read出错,需要考虑错误代码是不是中断错误?windows有没有中断出错的机制的
18 个解决方案
#1
自己去读两边的API手册
简单点,用跨平台的库。
简单点,用跨平台的库。
#2
windows下面的消息和linux下面的信号感觉不是一对等价的东西。一般说,windows下的消息是窗口的消息,通过GetMessage/DispatchMessage等API函数来处理。而linux下的信号是整个进程的信号,比如seg fault就会得到9号signal。Windows下面应该也有类似的信号机制。
Windows和linux的API几乎完全不同,Windows好像并没有很好的POSIX支持。因此,需要用到系统调用的时候,你最好写个wrapper,抽象出两个系统的功能,然后分别实现其行为。
#3
那么windows下的系统调用需要考虑中断错误吗?比如read,recv,send之类的函数。之前是没判断的,后来看到linux 下的这些函数的调用一般都进行判断,那么在windows下需要吗?
#4
通常linux下errno;windows下GetLastError()
#5
Windows下面应该也有信号机制(注意,不是消息),但是API跟linux下面完全不一样。好像没有read函数,windows下面是ReadFile函数,参数也完全不同。另外win32的socket(recv, send函数)和linux相比也有区别。具体可以参考msdn。
#6
感觉还是Linux的系统API更简洁一点
#7
windows下 API 肯定比 linux下 API复杂!!
#8
应该是readfile吧,那么readfile会不会被windows信号中断呢,一般我们在windows下处理readfile或者recv,需要这样处理吗?
/////大概代码,windows下
while(1)
{
if(readfile(.......)<0)
{
if(GetLastError()== EINTR) //中断错误
continue;//继续
else //其它错误退出循环
break;
}
.......
.......
}
我看见linux下的代码需要这样考虑,windows需要吗?windows的信号会令系统调用返回错误吗?
#9
GetLastError的返回值并没有EINTR,请参考MSDN的相关章节:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx
#10
我都说是大概代码啦,最主要的问题是windows会不会产生中断错误?直接回答好啦,不要再绕来绕去了。
#11
没人可以回答吗?
#12
无论windows还是linux都会进程意外退出。
windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
#13
我不是讨论windows下的进程会否异常退出,而是windows下的系统调用会不会类似linux的系统调用一样可能因为信号中断而异常返回?注意:是系统调用,比如windows 的一个线程在readfile阻塞中,会不会因为中断所以提前返回错误?是不是我表达的有问题啊?感觉大家回答的都不是我想问的问题。
#14
没人可以回答吗?唉,被这个问题困扰了很久
#15
在MSDN里面查看以下API:
ReadFile
ReadFileEx
ReadFileScatter
ReadFileVlm
ReadFile
ReadFileEx
ReadFileScatter
ReadFileVlm
#16
信号只会投递到一个线程,并中断之。
其他线程毫不知情。
其他线程毫不知情。
#17
只能说windows编程的api更复杂
#18
,起步中呢
#1
自己去读两边的API手册
简单点,用跨平台的库。
简单点,用跨平台的库。
#2
windows下面的消息和linux下面的信号感觉不是一对等价的东西。一般说,windows下的消息是窗口的消息,通过GetMessage/DispatchMessage等API函数来处理。而linux下的信号是整个进程的信号,比如seg fault就会得到9号signal。Windows下面应该也有类似的信号机制。
Windows和linux的API几乎完全不同,Windows好像并没有很好的POSIX支持。因此,需要用到系统调用的时候,你最好写个wrapper,抽象出两个系统的功能,然后分别实现其行为。
#3
那么windows下的系统调用需要考虑中断错误吗?比如read,recv,send之类的函数。之前是没判断的,后来看到linux 下的这些函数的调用一般都进行判断,那么在windows下需要吗?
#4
通常linux下errno;windows下GetLastError()
#5
Windows下面应该也有信号机制(注意,不是消息),但是API跟linux下面完全不一样。好像没有read函数,windows下面是ReadFile函数,参数也完全不同。另外win32的socket(recv, send函数)和linux相比也有区别。具体可以参考msdn。
#6
感觉还是Linux的系统API更简洁一点
#7
windows下 API 肯定比 linux下 API复杂!!
#8
应该是readfile吧,那么readfile会不会被windows信号中断呢,一般我们在windows下处理readfile或者recv,需要这样处理吗?
/////大概代码,windows下
while(1)
{
if(readfile(.......)<0)
{
if(GetLastError()== EINTR) //中断错误
continue;//继续
else //其它错误退出循环
break;
}
.......
.......
}
我看见linux下的代码需要这样考虑,windows需要吗?windows的信号会令系统调用返回错误吗?
#9
GetLastError的返回值并没有EINTR,请参考MSDN的相关章节:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx
#10
我都说是大概代码啦,最主要的问题是windows会不会产生中断错误?直接回答好啦,不要再绕来绕去了。
#11
没人可以回答吗?
#12
无论windows还是linux都会进程意外退出。
windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
#13
我不是讨论windows下的进程会否异常退出,而是windows下的系统调用会不会类似linux的系统调用一样可能因为信号中断而异常返回?注意:是系统调用,比如windows 的一个线程在readfile阻塞中,会不会因为中断所以提前返回错误?是不是我表达的有问题啊?感觉大家回答的都不是我想问的问题。
#14
没人可以回答吗?唉,被这个问题困扰了很久
#15
在MSDN里面查看以下API:
ReadFile
ReadFileEx
ReadFileScatter
ReadFileVlm
ReadFile
ReadFileEx
ReadFileScatter
ReadFileVlm
#16
信号只会投递到一个线程,并中断之。
其他线程毫不知情。
其他线程毫不知情。
#17
只能说windows编程的api更复杂
#18
,起步中呢