首页 新闻 会员 周边

linux C中signal和sigaction函数为什么有以下区别,请高手解释下

0
悬赏园豆:50 [待解决问题]

程序(1)

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<signal.h>
void SignHandler(int iSignNum)
{
printf("\nCapture signal number is:%d\n",iSignNum);
}
int main(void)
{
int iRet;
char szBuf[20];
struct sigaction act;
act.sa_sigaction=SignHandler;
act.sa_flags=SA_SIGINFO;
sigemptyset(&act.sa_mask);
sigaction(SIGINT,&act,NULL);

do
{
iRet=read(STDIN_FILENO,szBuf,sizeof(szBuf)-1);
if(iRet<0)
{
perror("read failed!\n");
break;
}
szBuf[iRet]='\0';
printf("%s",szBuf);
}while(strcmp(szBuf,"quit\n")!=0);
return 0;
}    

函数的执行结果是:

haheha
haheha
^C
Capture signal number is:2
read failed!
: Interrupted system call

我们看到Ctrl+C后,main函数会读出错,进程会中断

 

程序(2)

#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
void hello(int a)
{
printf("The input number is %d\n",a);
}


int main(void)
{
int iRet;
char buf[20];
signal(SIGINT,hello);
do
{
iRet=read(STDIN_FILENO,buf,sizeof(buf)-1);
if(iRet<0)
{
printf("read fialed!\n");
break;
}
buf[iRet]='\0';
printf("%s",buf);
}while(strcmp(buf,"quit\n")!=0);
return 0;

}

 

程序的运行结果如下:

wangguolong
wangguolong
shishishi
shishishi
jjjj
jjjj
^CThe input number is 2
wangguo
wangguo
^CThe input number is 2
^CThe input number is 2
^CThe input number is 2
^CThe input number is 2
^CThe input number is 2
^CThe input number is 2
^CThe input number is 2
^CThe input number is 2
^CThe input number is 2
wnagg
wnagg
^\Quit (core dumped)

  我们看到,在程序(2)中signal函数并没有触发 读出错中断

 

 

 

请高手解释下

退隐江湖的主页 退隐江湖 | 初学一级 | 园豆:152
提问于:2016-02-04 14:41
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册