信号(signal)介绍
3.有关信号的系统调用
前面两节已经介绍了有关信号的大部分知识。这一节我们来了解一下这些系统调用。其中,系统调用signal是进程用来设定某个信号的处理方法,系统调用kill是用来发送信号给指定进程的。这两个调用可以形成信号的基本操作。后两个调用pause和alarm是通过信号实现的进程暂停和定时器,调用alarm是通过信号通知进程定时器到时。所以在这里,我们还要介绍这两个调用。 3.1 signal 系统调用 系统调用signal用来设定某个信号的处理方法。该调用声明的格式如下: void (*signal(int signum, void (*handler)(int)))(int);在使用该调用的进程中加入以下头文件: #include上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义): typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler); 但这种格式在不同的系统中有不同的类型定义,所以要使用这种格式,最好还是参考一下联机手册。 在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是
传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。下面来看一个简单的例子: #include#include #include void sigroutine(int dunno) { /* 信号处理例程,其中dunno将会得到信号的值 */ switch (dunno) { case 1: printf("Get a signal -- SIGHUP "); break; case 2: printf("Get a signal -- SIGINT "); break; case 3: printf("Get a signal -- SIGQUIT "); break; } return; } int main() { printf("process id is %d ",getpid()); signal(SIGHUP, sigroutine); //* 下面设置三个信号的处理方法 signal(SIGINT, sigroutine); signal(SIGQUIT, sigroutine); for (;;) ; } 其中信号SIGINT由按下Ctrl-C发出,信号SIGQUIT由按下Ctrl-(back slash)发出。该程序执行的结果如下: localhost:~$ ./sig_testprocess id is 463 Get a signal -SIGINT //按下Ctrl-C得到的结果 Get a signal -SIGQUIT //按下Ctrl-得到的结果 //按下Ctrl-z将进程置于后台 [1]+ Stopped ./sig_test localhost:~$ bg [1]+ ./sig_test & localhost:~$ kill -HUP 463 //向进程发送SIGHUP信号 localhost:~$ Get a signal – SIGHUP kill -9 463 //向进程发送SIGKILL信号,终止进程 localhost:~$ 3.2 kill 系统调用 系统调用kill用来向进程发送一个信号。该调用声明的格式如下: int kill(pid_t pid, int sig);在使用该调用的进程中加入以下头文件: #include#include 该系统调用可以用来向任何进程或进程组发送任何信号。如果参数pid是正数,那么该调用将信号sig发送到进程号为pid的进程。如果pid等于0,那么信号sig将发送给当前进程所属进程组里的所有进程。如果参数pid等于-1,信号sig将发送给除了进程1和自身以外的所有进程。如果参数pid小于-1,信号sig将发送给属于进程组-pid的所有进程。如果参数sig为0,将不发送信号。该调用执行成功时,返回值为0;错误时,返回-1,并设置相应的错误代码errno。下面是一些可能返回的错误代码:
3.3 pause系统调用 系统调用pause的作用是等待一个信号。该调用的声明格式如下: int pause(void);在使用该调用的进程中加入以下头文件: #include该调用使得发出调用的进程进入睡眠,直到接收到一个信号为止。该调用总是返回-1,并设置错误代码为EINTR(接收到一个信号)。下面是一个简单的范例: #include#include #include void sigroutine(int unused) { printf("Catch a signal SIGINT "); } int main() { signal(SIGINT, sigroutine); pause(); printf("receive a signal "); } 在这个例子中,程序开始执行,就象进入了死循环一样,这是因为进程正在等待信号,当我们按下Ctrl-C时,信号被捕捉,并且使得pause退出等待状态。 3.4 alarm和 setitimer系统调用 系统调用alarm的功能是设置一个定时器,当定时器计时到达时,将发出一个信号给进程。该调用的声明格式如下: unsigned int alarm(unsigned int seconds);在使用该调用的进程中加入以下头文件: #include上一篇:使自己的程序成为后台运行的守护进程 下一篇:Linux进程编程介绍(四) 更多相关文章
|
推荐文章
精彩文章
|