Sigaction不起作用

时间:2017-12-19 16:04:55

标签: linux signals interprocess

我正在学习信号并写了一个与它们一起玩的简单程序。

所以我输入一个数字,然后使用fork我创建一个进程。父进程应该将数字作为信号发送到子进程,然后child_signal处理程序应该发回作为信号的平方数。

这是代码。

#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>
using namespace std;

void child_handler(int sig_num){
    cout<<"Child recieved a signal"<<endl;
    pid_t ppid = getppid();
    if(kill(ppid,sig_num*sig_num) == -1){
        cout<<"Childs signal handler failed to send a signal "<<endl;

    }
    cout<<"Sent a sgnal to the parent"<<endl;
    return;
}

void parent_handler(int sig_num){
    cout<<"Parent recieved a signal "<<endl;
    cout<<sig_num<<endl;
    return;
}

int main(){
    int n;
    cin>>n;
    pid_t pid = fork();
    if(pid != 0){

        struct sigaction sa2;
        memset(&sa2,0,sizeof(sa2));
        sa2.sa_handler = parent_handler;

        if(sigaction(n,&sa2,NULL) == -1){
            cout<<"Parents sigaction failed "<<endl;
        }

        if(kill(pid,n) == -1){
            cout<<"Kill failed "<<endl;
        }
        cout<<"Sent a signal to the child"<<endl;
        waitpid(pid,0,0);
    }
    else{

        struct sigaction sa1;
        memset(&sa1,0,sizeof(sa1));
        sa1.sa_handler = child_handler;       

        if(sigaction(n,&sa1,NULL) == -1){
            cout<<"Childs sigaction failed eerno:"<<errno<<endl;
        }

        sleep(20);

        return 0;
    }
    return 0;
}

输出就是这个。

向孩子发送了一个信号。

它没有说出任何关于sigaction的内容。

1 个答案:

答案 0 :(得分:0)

在您的代码中,子进程可以在设置处理程序之前接收信号。