一、kill, raise, killpg 函数
int kill(pid_t pid, int sig);
int raise(int sig);
int killpg(int pgrp, int sig);
kill命令是调用kill函数实现的,kill函数可以给一个指定的进程或进程组发送指定的信号,其中kill 函数的pid 参数取值不同表示不同含义,具体可man 一下。raise函数可以给当前进程发送指定的信号(自己给自己发信号)。killpg 函数可以给进程组发生信号。这三个函数都是成功返回0,错误返回-1。下面是个小程序示例:
/************************************************************************* > File Name: process_.c > Author: Simba > Mail: dameng34@163.com > Created Time: Sat 23 Feb 2013 02:34:02 PM CST ************************************************************************/#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) { /* pid = getpgrp(); // 得到进程组pid kill(-pid, SIGUSR1); //向进程组发送信号 */ killpg(getpgrp(), SIGUSR1); exit(EXIT_SUCCESS); // 子进程处理完信号才退出 } int n = 5; do { n = sleep(n); // sleep会被信号打断,返回unslept的时间 } while (n > 0); return 0;}void handler(int sig){ printf("recv a sig=%d\n", sig);}/* raise(sig) 等价于 kill(getpid(), sig) 给自己发送信号 */
程序中注册信号在fork之前,故子进程也会继承,在子进程中对进程组发送了信号,故信号处理函数会被调用两次:
simba@ubuntu:~/Documents/code/linux_programming/APUE/signal$ ./kill
recv a sig=10
recv a sig=10
simba@ubuntu:~/Documents/code/linux_programming/APUE/signal$
因为sleep 函数会被信号处理函数打断(RETURN VALUE: Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler.),如果我们想让其睡够5s, 则可以用一个while循环判断其返回值。这里需要注意的是输出两次recv之后继续睡眠的时间是不一定的,也有可能是5s,即信号处理函数在调用sleep之前已经被调用(子进程先被系统调度执行),sleep未被中断。也表明一点:只要接收到信号,信号处理函数可以在任意某个时刻被调用,不仅仅只在进程主动调用sleep, pause等函数(让cpu去调度运行其他程序)的时候,cpu一直都在进行进程的调度,进行用户空间和内核空间的切换, 当某个时刻要从内核返回到该进程的用户空间代码继续执行之前,首先就会处理PCB中记录的信号。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 函数
, include
, 进程
, 信号处理
, 信号
, sleep函数
编译APUE
高精度可编程直流电源、高精度时基信号发生器、可编程信号发生器、linux信号编程、linux信号量编程,以便于您获取更多的相关知识。