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