Apollon_krj
Apollon_krj
采纳率100%
2017-01-26 07:31 阅读 2.7k
已采纳

fork()父子进程间信号处理(江湖救急)

2

为什么在子进程中有死循环(如下图),而程序运行之后子进程中的死循环自动结束了,并且没有对收到的信号做自定义处理(输出:接收到信号2)呢?
图片说明

按理来说,结果不应该是这样么?
图片说明

源代码:

 #include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>

void accept_signal(int sig){
    printf("捕获了信号%d\n",sig);
    return;
}
int main(void)
{
    pid_t pid = fork();
    if(pid < 0){
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(pid == 0){
        signal(SIGINT,accept_signal);
        while(1);
    }
    printf("父进程给子进程%d发送信号2\n",pid);
    kill(pid,SIGINT);
    return 0;
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    Apollon_krj Apollon_krj 2017-01-26 16:28

    已经解决:在父进程执行kill之前sleep(1);以确保子进程先运行,否则父进程先运行,信号发送是有问题的。

    点赞 评论 复制链接分享
  • u012867916 Kilento 2017-01-26 14:01

    你在程序中不是已经把子进程kill掉了吗?
    kill(pid,SIGINT)

    把这句注释掉
    命令行里输kill -2

    另外问问题时,最好附上源码

    点赞 评论 复制链接分享
  • Apollon_krj Apollon_krj 2017-01-26 15:02

    父进程只是给子进程发送了一个信号2(SIGINT),而子进程对于信号2的处理,并不会按照默认的方式进行(默认是结束进程,子进程死循环被终止),应该按照我们自定义的信号处理函数进行处理(输出:捕获了信号2)。

    点赞 评论 复制链接分享
  • xieshangjian 征途开始 2018-08-16 08:44

    代码有问题。改成这样:
    if(pid < 0){
    perror("fork");
    exit(EXIT_FAILURE);
    }
    else if(pid == 0){
    signal(SIGINT,accept_signal);
    while(1);
    }else if(pid > 0)
    {
    printf("父进程给子进程%d发送信号2\n",pid);
    kill(pid,SIGINT);
    }
    return 0;

    点赞 评论 复制链接分享

相关推荐