linux 和windows编程问题

时间:2022-06-18 17:36:01
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中断其它线程,进入信号处理函数。
请问我这样理解对不对?
还有比如read函数返回值,在linux下假如read出错,还需判断错误代码是不是EINTR,防止中断错误。
那么windows下read出错,需要考虑错误代码是不是中断错误?windows有没有中断出错的机制的

18 个解决方案

#1


自己去读两边的API手册

简单点,用跨平台的库。

#2


引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中断其它线程,进入信号处理函数。
请问我这样理解对不对?
还有比如read函数返回值,在linux……


windows下面的消息和linux下面的信号感觉不是一对等价的东西。一般说,windows下的消息是窗口的消息,通过GetMessage/DispatchMessage等API函数来处理。而linux下的信号是整个进程的信号,比如seg fault就会得到9号signal。Windows下面应该也有类似的信号机制。

Windows和linux的API几乎完全不同,Windows好像并没有很好的POSIX支持。因此,需要用到系统调用的时候,你最好写个wrapper,抽象出两个系统的功能,然后分别实现其行为。

#3


引用 2 楼 Bluestones2012 的回复:
引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中断其它线程,进入信号处理函数。
请问我这样理解对不对?
还有比如read函数返回值,在……

那么windows下的系统调用需要考虑中断错误吗?比如read,recv,send之类的函数。之前是没判断的,后来看到linux 下的这些函数的调用一般都进行判断,那么在windows下需要吗?

#4


通常linux下errno;windows下GetLastError()

#5


引用 3 楼 g_h01 的回复:
引用 2 楼 Bluestones2012 的回复:引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中断其它线程,……


Windows下面应该也有信号机制(注意,不是消息),但是API跟linux下面完全不一样。好像没有read函数,windows下面是ReadFile函数,参数也完全不同。另外win32的socket(recv, send函数)和linux相比也有区别。具体可以参考msdn。

#6


感觉还是Linux的系统API更简洁一点

#7


windows下  API 肯定比  linux下 API复杂!!

#8


引用 5 楼 Bluestones2012 的回复:
引用 3 楼 g_h01 的回复:
引用 2 楼 Bluestones2012 的回复:引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中……

应该是readfile吧,那么readfile会不会被windows信号中断呢,一般我们在windows下处理readfile或者recv,需要这样处理吗?

/////大概代码,windows下
while(1)
{

  if(readfile(.......)<0)
  {
       if(GetLastError()== EINTR)  //中断错误
        continue;//继续
        else  //其它错误退出循环
       break;
  }
   .......
   .......
}

我看见linux下的代码需要这样考虑,windows需要吗?windows的信号会令系统调用返回错误吗?

#9


引用 8 楼 g_h01 的回复:
引用 5 楼 Bluestones2012 的回复:引用 3 楼 g_h01 的回复:
引用 2 楼 Bluestones2012 的回复:引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理……


GetLastError的返回值并没有EINTR,请参考MSDN的相关章节:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

#10


引用 9 楼 Bluestones2012 的回复:
引用 8 楼 g_h01 的回复:
引用 5 楼 Bluestones2012 的回复:引用 3 楼 g_h01 的回复:
引用 2 楼 Bluestones2012 的回复:引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相……

我都说是大概代码啦,最主要的问题是windows会不会产生中断错误?直接回答好啦,不要再绕来绕去了。

#11


没人可以回答吗? linux 和windows编程问题

#12


无论windows还是linux都会进程意外退出。
windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令

#13


引用 12 楼 zhao4zhong1 的回复:
无论windows还是linux都会进程意外退出。
windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 ……


我不是讨论windows下的进程会否异常退出,而是windows下的系统调用会不会类似linux的系统调用一样可能因为信号中断而异常返回?注意:是系统调用,比如windows 的一个线程在readfile阻塞中,会不会因为中断所以提前返回错误?是不是我表达的有问题啊?感觉大家回答的都不是我想问的问题。 linux 和windows编程问题

#14


没人可以回答吗?唉,被这个问题困扰了很久 linux 和windows编程问题

#15


在MSDN里面查看以下API:
ReadFile  
ReadFileEx  
ReadFileScatter  
ReadFileVlm 

#16


信号只会投递到一个线程,并中断之。

其他线程毫不知情。

#17


只能说windows编程的api更复杂

#18


linux 和windows编程问题,起步中呢

#1


自己去读两边的API手册

简单点,用跨平台的库。

#2


引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中断其它线程,进入信号处理函数。
请问我这样理解对不对?
还有比如read函数返回值,在linux……


windows下面的消息和linux下面的信号感觉不是一对等价的东西。一般说,windows下的消息是窗口的消息,通过GetMessage/DispatchMessage等API函数来处理。而linux下的信号是整个进程的信号,比如seg fault就会得到9号signal。Windows下面应该也有类似的信号机制。

Windows和linux的API几乎完全不同,Windows好像并没有很好的POSIX支持。因此,需要用到系统调用的时候,你最好写个wrapper,抽象出两个系统的功能,然后分别实现其行为。

#3


引用 2 楼 Bluestones2012 的回复:
引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中断其它线程,进入信号处理函数。
请问我这样理解对不对?
还有比如read函数返回值,在……

那么windows下的系统调用需要考虑中断错误吗?比如read,recv,send之类的函数。之前是没判断的,后来看到linux 下的这些函数的调用一般都进行判断,那么在windows下需要吗?

#4


通常linux下errno;windows下GetLastError()

#5


引用 3 楼 g_h01 的回复:
引用 2 楼 Bluestones2012 的回复:引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中断其它线程,……


Windows下面应该也有信号机制(注意,不是消息),但是API跟linux下面完全不一样。好像没有read函数,windows下面是ReadFile函数,参数也完全不同。另外win32的socket(recv, send函数)和linux相比也有区别。具体可以参考msdn。

#6


感觉还是Linux的系统API更简洁一点

#7


windows下  API 肯定比  linux下 API复杂!!

#8


引用 5 楼 Bluestones2012 的回复:
引用 3 楼 g_h01 的回复:
引用 2 楼 Bluestones2012 的回复:引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理,不会影响其它线程运行。
linux假如进行了信号处理,那么捕捉到信号就会中……

应该是readfile吧,那么readfile会不会被windows信号中断呢,一般我们在windows下处理readfile或者recv,需要这样处理吗?

/////大概代码,windows下
while(1)
{

  if(readfile(.......)<0)
  {
       if(GetLastError()== EINTR)  //中断错误
        continue;//继续
        else  //其它错误退出循环
       break;
  }
   .......
   .......
}

我看见linux下的代码需要这样考虑,windows需要吗?windows的信号会令系统调用返回错误吗?

#9


引用 8 楼 g_h01 的回复:
引用 5 楼 Bluestones2012 的回复:引用 3 楼 g_h01 的回复:
引用 2 楼 Bluestones2012 的回复:引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相应的线程处理……


GetLastError的返回值并没有EINTR,请参考MSDN的相关章节:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

#10


引用 9 楼 Bluestones2012 的回复:
引用 8 楼 g_h01 的回复:
引用 5 楼 Bluestones2012 的回复:引用 3 楼 g_h01 的回复:
引用 2 楼 Bluestones2012 的回复:引用 楼主 g_h01 的回复:
本来是学windows的最近要考虑跨平台,因此要研究linux的编程。其中有一个问题是windows下的消息和linux的信号机制。
我的理解是windows是捕捉到消息就会投递到相……

我都说是大概代码啦,最主要的问题是windows会不会产生中断错误?直接回答好啦,不要再绕来绕去了。

#11


没人可以回答吗? linux 和windows编程问题

#12


无论windows还是linux都会进程意外退出。
windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令

#13


引用 12 楼 zhao4zhong1 的回复:
无论windows还是linux都会进程意外退出。
windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 ……


我不是讨论windows下的进程会否异常退出,而是windows下的系统调用会不会类似linux的系统调用一样可能因为信号中断而异常返回?注意:是系统调用,比如windows 的一个线程在readfile阻塞中,会不会因为中断所以提前返回错误?是不是我表达的有问题啊?感觉大家回答的都不是我想问的问题。 linux 和windows编程问题

#14


没人可以回答吗?唉,被这个问题困扰了很久 linux 和windows编程问题

#15


在MSDN里面查看以下API:
ReadFile  
ReadFileEx  
ReadFileScatter  
ReadFileVlm 

#16


信号只会投递到一个线程,并中断之。

其他线程毫不知情。

#17


只能说windows编程的api更复杂

#18


linux 和windows编程问题,起步中呢