MST

星途 面试题库

面试题:C语言中如何在Linux环境下使用信号屏蔽实现简单的跨进程同步

在Linux系统下,用C语言编写代码实现两个进程通过信号屏蔽来进行简单的同步。父进程创建子进程后,子进程先执行一些操作,完成后通过信号通知父进程,父进程收到信号后再继续后续操作。请描述关键代码逻辑并写出核心代码片段。
27.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

关键代码逻辑

  1. 信号处理函数设置:父进程设置信号处理函数,用于处理子进程发来的信号。
  2. 信号屏蔽:父进程在创建子进程前屏蔽信号,防止信号提前到达。
  3. 子进程操作及信号发送:子进程执行一些操作后,发送信号给父进程。
  4. 父进程等待信号及后续操作:父进程解除信号屏蔽,等待信号到来,收到信号后执行后续操作。

核心代码片段

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

// 信号处理函数
void signal_handler(int signum) {
    printf("父进程收到信号,继续后续操作\n");
}

int main() {
    sigset_t set;
    // 初始化信号集
    sigemptyset(&set);
    // 将SIGUSR1添加到信号集中
    sigaddset(&set, SIGUSR1);

    // 注册信号处理函数
    signal(SIGUSR1, signal_handler);

    // 屏蔽信号
    sigprocmask(SIG_BLOCK, &set, NULL);

    pid_t pid = fork();
    if (pid == -1) {
        perror("fork");
        return 1;
    } else if (pid == 0) {
        // 子进程
        printf("子进程开始执行操作\n");
        // 模拟一些操作
        sleep(2);
        printf("子进程操作完成,发送信号给父进程\n");
        kill(getppid(), SIGUSR1);
    } else {
        // 父进程
        printf("父进程等待子进程信号\n");
        // 解除信号屏蔽
        sigprocmask(SIG_UNBLOCK, &set, NULL);
        // 等待子进程结束
        wait(NULL);
    }

    return 0;
}