本文主要是介绍关于 kill 函数和 linux SA_RESTART的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
信号是异步的,它会在程序的任何地方发生。由此程序正常的执行路径被打破,去执行信号处理函数。一般情况下,进程正在执行某个系统调用,那么在该系统调用返回前信号是不会被递送的。但慢速系统调用除外,如读写终端、网络、磁盘,以及wait和pause。这些系统调用都会返回-1,errno置为EINTR。当系统调用被中断时,我们可以选择使用循环再次调用,或者设置重新启动该系统调用(SA_RESTART)。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
void int_handler (int signum)
{
printf ("int handler %d\n",signum);
}
int main(int argc, char **argv)
{
char buf[100];
ssize_t ret;
struct sigaction oldact;
struct sigaction act;
act.sa_handler = int_handler;
act.sa_flags=0;
act.sa_flags |= SA_RESTART;
sigemptyset(&act.sa_mask);
if (-1 == sigaction(SIGINT,&act,&oldact))
{
printf("sigaction failed!\n");
return -1;
}
bzero(buf,100);
ret = read(STDIN_FILENO,buf,10);
if (ret == -1)
{
printf ("read error %s\n", strerror(errno));
}
printf ("read %d bytes, content is %s\n",ret,buf);
sleep (10);
return 0;
}
^Cint handler 2
^Cint handler 2
^Cint handler 2
^Cint handler 2
^Cint handler 2
^Cint handler 2
hgfd
read 5 bytes, content is hgfd
把程序不用SA_RESTART:
结果
^Cint handler 2
read error Interrupted system call
read -1 bytes, content is
程序立即结束啦。
下面关于 kill(pid_t pid, 0):
虽然从函数的表面意思上看是杀死进程, 但是kill函数不单单只是杀死进程,而是对指定进程或进程组发送指定信号(SIGKILL, SIG).
函数原型如下:
int kill(pid_t pid, int sig);
pid > 0 向pid指定的进程发送sig指定的信号.
pid == 0 向调用kill函数所在进程组中的所以进程发sig指定的信号.
pid == -1 向调用kill函数所在进程拥有权限的所有进程发宋sig信号,除了进程1(init).
pid < -1 向进程组id 为-pid 内的所有进程发送sig 信号.
返回值:成功返回0; 错误返回-1,并且errno会被设置相应的值.
如果sig == 0, 没有信号发送,但是错误检查还是会执行.sig=0, 可以被用于检查pid指定的进程或进程组是否存在.
如下:
if(kill(mClientPid, 0) == -1 && errno == ESRCH){
printf("client process is dead!\n");
}
可以用命令行kill -l 查看所以信号
zhangpan-pc:/usr/include/c++/5.4.0$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
参考自:http://blog.chinaunix.net/uid-27801149-id-5774548.html
https://blog.csdn.net/gexiao/article/details/19488433
http://blog.csdn.net/ccccdddxxx/article/details/6308381
这篇关于关于 kill 函数和 linux SA_RESTART的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!