问题描述
我的程序经历了这样的循环:
... while(1){ read(sockfd,buf,sizeof(buf)); ... }
读取功能在等待输入时会块,恰好来自插座.我想处理sigint,并基本上告诉它,如果读取功能是读取的,然后调用任意函数.什么是最好的方法?
推荐答案
来自read(2):
EINTR The call was interrupted by a signal before any data was read; see signal(7).
如果您对代码进行修改,看起来更像:
cont = 1; while (1 && cont) { ret = read(sockfd, buf, sizeof(buf)); if (ret < 0 && errno == EINTR) cont = arbitrary_function(); }
这让arbitrary_function()确定read(2)是否应该重新尝试.
更新
您需要处理信号才能从read(2)中获得EINTR行为:
#include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<signal.h> #include<errno.h> int interrupted; void handle_int(num) { interrupted = 1; } int main(void){ char buf[9001]; struct sigaction int_handler = {.sa_handler=handle_int}; sigaction(SIGINT,&int_handler,0); while(!interrupted){ printf("interrupted: %d\n", interrupted); if(read(0,buf,sizeof(buf))<0){ if(errno==EINTR){ puts("eintr"); }else{ printf("%d\n",errno); } puts("."); } } puts("end"); return 0; }
给出输出:
$ ./foo interrupted: 0 hello interrupted: 0 ^Ceintr . end
其他推荐答案
当您的过程收到信号时,read()将返回,errno的值将设置为EINTR.
相关问答
相关标签/搜索