C未正确接收实时信号

C未正确接收实时信号,c,signals,C,Signals,我编写了一些代码,其工作原理如下:我正在创建一个子进程,然后向他发送N个实时信号(例如SIGRTMIN),然后发送其他实时信号(例如SIGRTMAX)。子进程应该有合适的信号处理程序,它可以发回SIGRTMIN信号,在SIGRTMAX之后,他应该结束。我的问题是,如果我给孩子发送10个信号,一次我接收到父母的10个信号,一次是0,一次只是1个信号。我希望收到的信号总是和我发出的信号一样多。谁能给点建议吗? 家长: \define\u BSD\u源 #包括 #包括 #包括 #包括 #包括 #包括

我编写了一些代码,其工作原理如下:我正在创建一个子进程,然后向他发送N个实时信号(例如SIGRTMIN),然后发送其他实时信号(例如SIGRTMAX)。子进程应该有合适的信号处理程序,它可以发回SIGRTMIN信号,在SIGRTMAX之后,他应该结束。我的问题是,如果我给孩子发送10个信号,一次我接收到父母的10个信号,一次是0,一次只是1个信号。我希望收到的信号总是和我发出的信号一样多。谁能给点建议吗? 家长:

\define\u BSD\u源
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int请求,子pid,收入信号计数器=0;
新结构;
联合西格瓦尔西格瓦尔大学tmp;
void generateChild(){
int-pid=fork();
如果(pid==0){
如果(execvp(“./child”,NULL)=-1){
printf(“某事物出错”);
出口(1);
}
出口(0);
}否则,如果(pid>0){
美国LEEP(100000);
child_pid=pid;
}
}      
void sendSignalsByKillWithRTSignals(){
发送的int信号=0;

对于(inti=0;ii)如果您想在两个进程之间进行通信,请查看IPC,即管道或套接字
#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;
}
#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;
}