Linux环境编程之信号(三):一些信号函数
(一)kill和raise函数
kill函数将信号发送给进程或进程组。raise函数则允许进程自身发送信号。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
int raise(int signo); //返回值:若成功则返回0,若出错则返回-1。
参数:pid参数有4种情况:1、pid > 0 将信号发送给进程为pid的进程。2、pid == 0 将该信号发送给与发送进程属于同一进程组的所有进程,而且发送进程具有向这些进程发送信号的权限。3、pid < 0 将该信号发送给其进程组ID等于pid的绝对值,而且发送进程具有向其发送信号的权限。4、pid == -1 将该信号发送给进程有权限向它们发送信号的系统上的所有进程。signo可以是0,此时kill仍执行正常的错误检查,但不发送信号。这常被用来确定一个特定进程是否仍旧存在。如果向一个并不存在的进程发送空信号,则kill返回-1,并将errno设置为ESRCH。注意:对于进程是否存在的这种测试不是原子操作。在kill向调用者返回测试结果时,原来存在的被测试进程此时可能已经终止。
程序引自:http://blog.csdn.net/jnu_simba/article/details/8944647
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <signal.h> #define ERR_EXIT(m) do{ perror(m); exit(EXIT_FAILURE); }while(0) void handler(int sig); int main(int argc, char *argv[]) { if(signal(SIGUSR1, handler) == SIG_ERR) ERR_EXIT("signal error"); pid_t pid = fork(); if(pid == -1) ERR_EXIT("fork error"); if(pid == 0){ killpg(getpgrp(), SIGUSR1); exit(EXIT_SUCCESS); } int n = 5; do{ n = sleep(n); } while(n > 0); return 0; } void handler(int sig) { printf("recv a sig = %d\n", sig); }
(二)alarm和pause函数
使用alarm函数可以设置一个计时器,在将来某个指定的时间该计时器会超时。当计时器超时时,产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程。
#include <unistd.h>
unsigned int alarm(unsigned int seconds); // 返回值:0或以前设置的闹钟时间的余留秒数。
其中参数seconds的值是秒数,经过了指定的seconds秒后会产生信号SIGALRM,该信号是由内核产生的。
pause函数使调用进程挂起直至捕捉到一个信号。
#include <unistd.h>
int pause(void); //返回值: -1,并将errno设置为EINTR
只有执行一个信号处理程序并返回时,pause才返回。在这种情况下,pause返回-1,并将errno设置为EINTR。
程序引自:http://blog.csdn.net/jnu_simba/article/details/8944647
#include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <signal.h> #define ERR_EXIT(m) do{ perror(m); exit(EXIT_FAILURE);\ }while(0) void handler(int sig); int main(int argc, char *argv[]) { if(signal(SIGALRM, handler) == SIG_ERR) ERR_EXIT("signal error"); alarm(1); for(;;) pause(); return 0; } void handler(int sig) { printf("recv a sig = %d\n", sig); alarm(1); }