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

标签 c linux signals posix

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

第一个代码:

#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()

关于发送信号的代码,其中一个终端关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117306/

相关文章:

java - 使用 java 发送带有消息头 + InetAddress 的消息,但得到的结果与预期不同

linux - 理性协同: Cannot login with username

swift - 在 Swift 命令行应用程序中捕获信号

linux - 为什么信号处理程序在系统调用期间无法运行?

iphone - 我们是否可以通过编程来自动加入信号最强的WiFi,而无需手动选择?

c++ - 如何在 gdb 中打印长字符串的完整值?

c - 调用函数是否比 SendMessage() 更快?

c++ - 在 C++ 中读取和写入同一个二进制文件

linux - 用户相关的文件内容

android - 在linux中的android studio中构建cpp项目时出错