0

I am learning about signals and wrote a simple programs that plays with them.

So i am inputting a number then using fork i create a process.The parent process is supposed to send the number as a signal to the child process,then the child_signal handler is supposed to send back the number squared as a signal.

This is the code.

#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;
}

The output is this.

Sent a signal to the child.

And it doesn't say anything about sigaction.

1 Answers1

0

In your code a child process can receive a signal before setting a handler.

Red User
  • 429
  • 3
  • 9