用信号 (Signals) 实现进程间通信

2019-12-05  本文已影响0人  wjundong

先备知识进程通信之信号(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); 
}

程序执行结果

image.png
上一篇 下一篇

猜你喜欢

热点阅读