先备知识:进程通信之信号(Signals)
在这篇文章中,子进程和父进程之间的通信使用的是 kill()
和 signal()
,fork()
系统调用完成的。
fork()
从父进程创建子进程。可以检查返回值 pid 以决定它是子进程(如果 pid == 0 )还是父进程(pid = 子进程id)。
然后,父进程可以使用pid和kill()向子级发送消息。子进程使用signal()获取这些信号,并调用相应的函数。
示例
下面是如何使用 kill() 和 signal() 在 2 个进程中相互通信的示例
// C程序演示 sighup(), sigint() and sigquit() 信号函数
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
// 函数声明
void sighup();
void sigint();
void sigquit();
void main()
{
int pid;
/* 创建子进程 */
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
/* 子进程 */
if (pid == 0) {
signal(SIGHUP, sighup);
signal(SIGINT, sigint);
signal(SIGQUIT, sigquit);
for (;;)
; /* 死循环 */
/* 父进程 */
} else {
printf("\n父亲: 发送 SIGHUP\n\n");
kill(pid, SIGHUP);
sleep(3); /* 暂停 3s */
printf("\n父亲: 发送 SIGINT\n\n");
kill(pid, SIGINT);
sleep(3); /* 暂停 3s */
printf("\n父亲: 发送 SIGQUIT\n\n");
kill(pid, SIGQUIT);
sleep(3);
}
}
// 定义 sighup() 函数
void sighup()
{
signal(SIGHUP, sighup); /* 重置信号 */
printf("孩子: 我收到了一个 SIGHUP\n");
}
// 定义 sigint() 函数
void sigint()
{
signal(SIGINT, sigint); /* 重置信号 */
printf("孩子: 我收到了一个 SIGINT\n");
}
// 定义 sigquit() 函数
void sigquit()
{
printf("我的爸爸竟要杀我!!!\n");
exit(0);
}
程序执行结果
![](https://img.haomeiwen.com/i17837162/809a699311c61282.png)
网友评论