发送信号的代码,其中一个终端关闭

Code that send signals, one of the terminals closes

我有一个问题,是因为我执行了这两个代码,第二个在我执行的时候关闭了终端,第一个因此被阻塞了。

第一个代码:

#include <signal.h>
#include <pthread.h>
#include <stdio.h>
#define N 10    // Numero de plazas disponibles en total

int POcupadas;

int main(){
    POcupadas = 0;
    int sig;
    union sigval user_sigval;

    sigset_t sigset;
    siginfo_t siginfo;

    sigemptyset(&sigset);
    sigaddset(&sigset, SIGRTMIN);
    pthread_sigmask(SIG_BLOCK, &sigset, NULL);

    while(1){
        sig=sigwaitinfo(&sigset, &siginfo);
        int pid = siginfo.si_value.sival_int;

        if (sig!=-1){
            if (POcupadas != N){
                ++POcupadas;
                user_sigval.sival_int = 0;
                sigqueue(pid, SIGRTMIN+1, user_sigval);
            }else{
                user_sigval.sival_int = 1;
                sigqueue(pid, SIGRTMIN+1, user_sigval);

                break;
            }

        }else{
            printf("Error");
        }

    }
    return 0;
}

第二个代码:

#include <signal.h>
#include <stdio.h>
#include <pthread.h>

int main () {
    int sig;
    srand(time(NULL));
    sigset_t set;
    siginfo_t siginfo;

    union sigval user_sigval;
    int i, num;

    sigemptyset(&set);
    sigaddset(&set,SIGRTMIN+1);
    pthread_sigmask(SIG_BLOCK, &set, NULL);     

    // PID
    int pid = 5845;
    // PID

    for(i=0; i<30; i++) {
        user_sigval.sival_int = getppid();
        sigqueue(pid, SIGRTMIN, user_sigval);

        sig=sigwaitinfo(&set, &siginfo);

        if (siginfo.si_value.sival_int == 0){
            printf ("Continue executing the code.\n");

        }else{  // No hay sitio 1
            printf ("Finish executing the code.\n");
            break;
        }

        sleep(1);
    }

    return 0;
}

这是为什么?我做错了什么?

看来你是在自作自受。考虑第二个代码的摘录:

    user_sigval.sival_int = getppid();
    sigqueue(pid, SIGRTMIN, user_sigval);

现在看第一段代码的中心部分:

    sig=sigwaitinfo(&sigset, &siginfo);
    int pid = siginfo.si_value.sival_int;

    if (sig!=-1){
        if (POcupadas != N){
            ++POcupadas;
            user_sigval.sival_int = 0;
            sigqueue(pid, SIGRTMIN+1, user_sigval);
        }else{
            user_sigval.sival_int = 1;
            sigqueue(pid, SIGRTMIN+1, user_sigval);

            break;
        }

    }else{
        printf("Error");
    }

假设进程 运行 第二个代码(进程 2)成功地将其信号定向到进程 运行 第一个代码(进程 1),进程 1 通过向其 PID 的进程发出信号来响应与信号一起传送。即进程2的parent(参考第二个代码摘录中的getppid())。实时信号的默认处理是进程终止。

您可能希望进程 2 随信号发送自己的 PID;拼写为 getpid().