Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C SIGALRM中断系统调用_C_Linux_Signals - Fatal编程技术网

C SIGALRM中断系统调用

C SIGALRM中断系统调用,c,linux,signals,C,Linux,Signals,我需要在超时后中断一个系统调用(recvfrom)。为此,我使用了alarm(),但是结果SIGALRM会终止我的进程,而不仅仅是中断系统调用 我尝试调用signal(SIGALRM,SIG_IGN)来处理SIGALRM,但这会导致系统调用根本不会被中断!我实现这一点的唯一方法是创建一个自定义的空处理程序(signal(SIGALRM,alrm_handler))-该处理程序不执行任何操作,但仍然会导致recvfrom被中断,而不会终止进程 我知道默认信号处理程序(SIG_DFL)将终止进程,但

我需要在超时后中断一个系统调用(
recvfrom
)。为此,我使用了
alarm()
,但是结果SIGALRM会终止我的进程,而不仅仅是中断系统调用

我尝试调用
signal(SIGALRM,SIG_IGN)
来处理SIGALRM,但这会导致系统调用根本不会被中断!我实现这一点的唯一方法是创建一个自定义的空处理程序(
signal(SIGALRM,alrm_handler)
)-该处理程序不执行任何操作,但仍然会导致
recvfrom
被中断,而不会终止进程

我知道默认信号处理程序(SIG_DFL)将终止进程,但我希望SIG_IGN忽略信号,但仍然中断系统调用。I
strace
d一个带有SIG\u IGN和自定义空处理程序的测试程序,它们最终都会调用
rt\u sigaction(SIGALRM…
,而无需重新启动SA\u。据我所知,如果设置了SA_RESTART,那么系统调用将自动重新启动,但不管怎样,SIG_IGN都会发生这种情况


有没有更干净的方法可以在不需要自定义信号处理程序的情况下用SIGALRM中断系统调用?

当您告诉操作系统忽略一个信号时,如果发出信号时它什么也不做,并且忽略它,您不应该感到惊讶。POSIX仅允许
recvfrom
在被中断时返回EINTR,并且仅在调用信号处理程序时才被中断。当
SIG\u IGN
设置为“信号的传送将不会对过程产生影响。”

对套接字操作执行超时的更好方法是使用
setsockopt(fd,SOL\u socket,SO\u RCVTIMEO,…)
在套接字上设置超时。如果超时,您将得到
EAGAIN
ewooldblock
错误

您可能还想查看
select
,这可能会消除使用超时的需要