1、信号通信
内核中存在64种信号,即linux 内核可以发送64种信号,命令“kill -l”可以查看
A - 信号的发送:kill、raise、alarm
kill(pid_t pid, int sig)
raise(int sig) 等价于 kill(getpid(), int sig) 即发给自己
附:终止进程 kill 9 进程号 或 raise(9) 终止自己 (9为SIGKILL信号)
alarm(int n) 定时 n 秒
B - 信号的接收:pause、sleep、while
C - 信号的处理:signal
处理哪个信号
以什么方式处理(SIG_IGN忽略,SIG_DFL默认,myfun自定义)
2、getpid() 获得进程 id 号
getppid()获得父进程 id 号
3、exit(0) 等价于 kill(getppid(), 17) 即,向父进程发送 17 信号(SIGCHLD)
4、wait(NULL) 可回收僵尸进程。本身为阻塞函数
代码:
执行:#include <stdio.h> //standard input output #include <sys types.h=""> //pid_t pid;
fork() #include <signal.h> //signal #include <stdlib.h> //exit(0) 否则会有warning警告 void myfun(int sig) {
int i;
for(i = 0;
i < 5;
i++) {
printf("sig = %d, i = %dn",sig,i);
sleep(1);
}
return;
}
void myfun1(int sig) {
printf("NOTE: exit() sig = %dn",sig);
wait(NULL);
printf("NOTE: child process has been retrieved.n");
return;
}
int main() {
pid_t pid;
pid = fork();
if(pid > 0) {
printf("parent pid = %dn",getpid());
int i = 0;
signal(10, myfun);
//wait(NULL);
回收子进程的僵尸进程。但wait是阻塞函数。等待子进程结束时,后面的代码将无法执行 signal(17,myfun1);
while(1) {
printf("parent process i = %dn",i);
sleep(1);
i++;
}
}
if(pid == 0) {
printf("child pid = %d, parent pid = %dn", getpid(), getppid());
sleep(3);
kill(getppid(),10);
//getppid()获取父进程id。10为SIGUSR1信号 sleep(3);
exit(0);
//等价于 kill(getppid(),17)。17 为 SIGCHLD信号 }
return 0;
}
</stdlib.h></signal.h></sys></stdio.h>