Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux中使用sigaction(C+;+;)的信号处理程序_C++_Linux_Signals_Handler - Fatal编程技术网

C++ Linux中使用sigaction(C+;+;)的信号处理程序

C++ Linux中使用sigaction(C+;+;)的信号处理程序,c++,linux,signals,handler,C++,Linux,Signals,Handler,我试图使用自定义处理程序在多个进程之间发送SIGUSR1/SIGUSR2信号,但我的处理程序不工作。它没有打印任何调试消息或任何东西 在这里,我创建了8个进程,并尝试使用set_sigaction函数设置自定义处理程序: int main(){ pidArray = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Self pid pidArray2

我试图使用自定义处理程序在多个进程之间发送SIGUSR1/SIGUSR2信号,但我的处理程序不工作。它没有打印任何调试消息或任何东西

在这里,我创建了8个进程,并尝试使用set_sigaction函数设置自定义处理程序:

int main(){
    pidArray = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Self pid
    pidArray2 = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Child pid
    counter = (int *)mmap(NULL, MMAP_SIZE2, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);
    counter[0]=0;
    counter[1]=0;
    pid_t pid, pid2;
    int counter = 1;
    pidArray[0]=getpid();
    pid = fork(); //1
    if(pid == 0){
        pid = fork(); //2
        if(pid != 0){
            pidArray[1]=getpid();
            pidArray2[1]=pid;
        }
        if(pid == 0){
            pid2 = getpid();
            pidArray[2]=pid2;
            pid=fork(); //4
            if(pid == 0){
                pidArray[4] = getpid();
                pid=fork(); //5
                if(pid==0){
                    pidArray[5] = getpid();
                    pidArray2[5] = 0;
                }
                else
                    pidArray2[4] = pid;
            }
        if(pid2 == getpid()){
            pid2 = fork(); //3
            if(pid2!=0){
                pid = setpgid(pid,pid2);
            }
            else{
                pidArray[3]=getpid();
                pid=fork(); //6
                if(pid==0){
                    pidArray[6]=getpid();
                    pid=fork(); //7
                    if(pid==0){
                        pidArray[7]=getpid();
                        pid=fork(); //8
                        if(pid!=0)
                            pidArray2[7]=pid;
                        else{
                            pidArray[8]=getpid();
                            pidArray2[8]=pidArray[1];
                        }

                    }
                    else
                        pidArray2[6]=pid;
                }
                else
                    pidArray2[3]=pid;
            }
        }        
        }
    }

    set_sigaction(SIGUSR1);

    sleep(5);

    if(getpid()==pidArray[1])
        kill(pidArray[0],SIGTERM);
    if(getpid()==pidArray[1]){
        send_signal(pidArray[1]);
    }
    sleep(100);
    return 0; 
static int set_sigaction(int signo) 
{ 
    struct sigaction sa; 
    memset(&sa, 0, sizeof(struct sigaction));
    sa.sa_sigaction = handler;
    sigemptyset(&sa.sa_mask);  
    sa.sa_flags = SA_SIGINFO;
    return sigaction(signo, &sa, NULL);
}
下面是set_SIGATION函数:

int main(){
    pidArray = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Self pid
    pidArray2 = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Child pid
    counter = (int *)mmap(NULL, MMAP_SIZE2, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);
    counter[0]=0;
    counter[1]=0;
    pid_t pid, pid2;
    int counter = 1;
    pidArray[0]=getpid();
    pid = fork(); //1
    if(pid == 0){
        pid = fork(); //2
        if(pid != 0){
            pidArray[1]=getpid();
            pidArray2[1]=pid;
        }
        if(pid == 0){
            pid2 = getpid();
            pidArray[2]=pid2;
            pid=fork(); //4
            if(pid == 0){
                pidArray[4] = getpid();
                pid=fork(); //5
                if(pid==0){
                    pidArray[5] = getpid();
                    pidArray2[5] = 0;
                }
                else
                    pidArray2[4] = pid;
            }
        if(pid2 == getpid()){
            pid2 = fork(); //3
            if(pid2!=0){
                pid = setpgid(pid,pid2);
            }
            else{
                pidArray[3]=getpid();
                pid=fork(); //6
                if(pid==0){
                    pidArray[6]=getpid();
                    pid=fork(); //7
                    if(pid==0){
                        pidArray[7]=getpid();
                        pid=fork(); //8
                        if(pid!=0)
                            pidArray2[7]=pid;
                        else{
                            pidArray[8]=getpid();
                            pidArray2[8]=pidArray[1];
                        }

                    }
                    else
                        pidArray2[6]=pid;
                }
                else
                    pidArray2[3]=pid;
            }
        }        
        }
    }

    set_sigaction(SIGUSR1);

    sleep(5);

    if(getpid()==pidArray[1])
        kill(pidArray[0],SIGTERM);
    if(getpid()==pidArray[1]){
        send_signal(pidArray[1]);
    }
    sleep(100);
    return 0; 
static int set_sigaction(int signo) 
{ 
    struct sigaction sa; 
    memset(&sa, 0, sizeof(struct sigaction));
    sa.sa_sigaction = handler;
    sigemptyset(&sa.sa_mask);  
    sa.sa_flags = SA_SIGINFO;
    return sigaction(signo, &sa, NULL);
}
这是处理程序:

static void handler(int signo, siginfo_t* si, void* ucontext){
    int k;
    int i;
    pid_t pid = getpid();
    for(i=1;i<9;i++){
        if(pidArray[i]==pid)
            k=i;
    }
    time_t rawtime;
    time ( &rawtime );
    cout << k << " " << pid << " Got USR1 " << ctime (&rawtime) << "\n";
    send_signal(getpid());
}
静态无效处理程序(int-signo、siginfo\u t*si、void*ucontext){
int k;
int i;
pid_t pid=getpid();
对于(i=1;i发送信号的作用是什么?
尝试使用kill函数发送信号,如下所示:


kill(pidArray[1],SIGUSR1)

您应该小心处理POSIX信号:当信号触发时,它可能会中断一切(甚至是内核调用)。这意味着,在处理信号时,您可能处于不正确的状态,您可能存在数据竞争,…在信号处理程序中,您应该尽可能快地退出,并且您应该避免大部分具有副作用的操作(如I/O)。谢谢您的建议,但是如果我的处理程序只有一条调试消息,它仍然不会打印它。您确定给
sigaction
一个局部变量(不在
main
中)的地址没有问题吗?您只能从信号处理程序调用一小部分异步信号安全函数。此信号处理程序调用的函数不在该集合中。是的,类似于此,但用于不同的进程