2

I write some code, which should works as follow: I am creating a child process, then send to him N real time signals (e.g. SIGRTMIN) and after it other real time signal (e.g. SIGRTMAX). Child process should have suitable signal handler which send back SIGRTMIN signals, and after SIGRTMAX, he should end. My problem is, if I send to child 10 signals, one time i receive in parent 10 signals , one time 0 and one time just 1 signal. I expect to receive always as many signals as I send. Can somebody please advice? Parent:

#define _BSD_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <unistd.h>

int requests, child_pid, income_signal_counter = 0;
struct sigaction new;
union sigval sigval_tmp;


void generateChild(){
    int pid = fork();
    if (pid == 0){
        if(execvp("./child", NULL) == -1){
            printf("Sth goes wrong\n");
            exit(1);
        }
        exit(0);
    }else if(pid > 0){
        usleep(100000);
        child_pid = pid;
    }
}      

void sendSignalsByKillWithRTSignals(){
    int signal_sent = 0;
    for(int i =0; i<requests; i++){
        if(kill(child_pid, SIGRTMIN)== 0){
            signal_sent ++;
        }
    }
    printf("(parent)Wyslanych sygnalow SIGRTMIN: %d\n", signal_sent);
    kill(child_pid, SIGRTMAX);
}
  void RTMinSignalHandler(){
    income_signal_counter++;
   // printf("(parent)Liczba otrzymanych SIGRTMIN: %d/%d\n", income_signal_counter, requests);
}


int main(int argc, char *argv[]){
    requests = atoi(argv[1]);
    int  func_type = atoi(argv[2]);

    generateChild();
    struct sigaction new;
    new.sa_handler = &RTMinSignalHandler;
    new.sa_flags = 0;
    sigaction(SIGRTMIN, &new, NULL);


    sendSignalsByKillWithRTSignals();

    int wstatus;
    wait(&wstatus);
    if(WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != 0){
        printf("Proces potomny zdechl\n");
        exit(2);
    }

    printf("(parent)Signal SIGRTMIN received: %d/%d\n", income_signal_counter, requests);
    return 0;
}

Child:

#define _BSD_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

volatile int parent_id;

void signalHandler(int signal){
    kill(parent_id, signal);
}

void exitSignalHandler(int signal){
    _exit(0); 
}

int main(int argc, char *argv[]){
    parent_id = getppid();
    struct sigaction new;

    new.sa_handler = &signalHandler;
    new.sa_flags = 0;
    sigaction(SIGRTMIN, &new, NULL);

    new.sa_handler = &exitSignalHandler;
    new.sa_flags = 0;
    sigaction(SIGRTMAX, &new, NULL);

    while(1){
    }
    return 0;
}
Greg Wator
  • 21
  • 2
  • If you want to have communication between two processes, look into IPC, i.e., pipes or sockets. Look at [signal queuing in C](http://stackoverflow.com/questions/5285414/signal-queuing-in-c) – Arash Apr 05 '17 at 21:30

0 Answers0