首页 > 解决方案 > 如何使用 sigwait() 使用信号的延迟

问题描述

在分配时,我需要编写一个程序,它打开一个通道管道并产生两个后代进程,然后父进程从输入文件中填充通道,然后将信号 SIGQUIT 发送给后代,后代可以从通道读取字符并发送每个在将 SIGUSR1 和 SIGUSR2 的下一个符号读取给另一个后代之后的其他信号能够开始读取,但是存在一个问题:在循环中读取父级是昏迷的,如果 debajo 步骤那么一切都很好,它退出循环,或者如果执行程序的干净行,则退出循环。我不明白问题可能是什么。在后代中,我使用 sigwait 等待。我将在下面介绍父母和后代的代码。请告诉我怎么了?父母的代码:

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>
#include <signal.h>
#include <wait.h>

using namespace std;

int main() {
    sigset_t new_mask;
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGUSR1);
    sigaddset(&new_mask, SIGUSR2);
    sigaddset(&new_mask, SIGQUIT);
    sigprocmask(SIG_SETMASK, &new_mask, NULL);
    int fildes[2];
    pipe(fildes);
    pid_t pid1;
    pid_t pid2;
    pid1 = fork();
    if (pid1 == 0) {
        //execl("1","1", "output1.txt", &fildes[0], &fildes[1],NULL);
        close(fildes[0]);
        _exit(0);
    }
    else {
        pid2 = fork();
        if (pid2 == 0) {
            execl("2","2", "output2.txt", &fildes[0], &fildes[1], NULL);
            close(fildes[0]);
            _exit(0);
        }
        else {
            close(fildes[0]);
            cout<<"Parent"<<endl;
            ifstream file("input.txt");
            if (file.is_open()) {
                string str;
                bool t = true;
                t = (bool)getline(file, str);
                while(t){
                    write(fildes[1], &str[0], strlen(str.c_str()));
                    cout<<"PARENT пишет:" << str << endl;
                    cout<< "sdsdsds";
                    t = (bool)getline(file, str);
                }
                cout << "aaaaaaaaaaaaaaaaaaaaaaaaa";
                killpg(0, SIGQUIT);
                file.close();
            }
            int st1, st2;
            waitpid(pid1, &st1, 0);
            waitpid(pid2, &st2, 0);
            close(fildes[1]);
            exit(EXIT_SUCCESS);

        }
    }

    return 0;
}

第一个孩子的代码:

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>
#include <signal.h>
#include <wait.h>
#include <cerrno>  

using namespace std;

int main(int argc, char** argv) {
    int fildes[2];
    fildes[0]=*argv[2];
    fildes[1]=*argv[3];
    close(fildes[1]);
    sigset_t mask_sig;
    sigemptyset(&mask_sig);
    sigaddset(&mask_sig, SIGUSR1);
    sigaddset(&mask_sig, SIGQUIT);
    ofstream file;
    int last_sig;
    char ch;
    file.open(argv[1], ios::app);
    //file << read(fildes[0], &ch, 1)  << endl;
    sigwait(&mask_sig, &last_sig);
    while(read(fildes[0], &ch, 1) > 0){
        //file << "a" << endl;
        file << ch;
        killpg(0, SIGUSR2);
        sigwait(&mask_sig, &last_sig);
    }
    killpg(0, SIGUSR2);
    file.close();
    return 0;
}

第二个孩子的代码:

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>
#include <signal.h>
#include <wait.h>

using namespace std;

int main(int argc, char** argv) {
    int fildes[2];
    fildes[0]=*argv[2];
    fildes[1]=*argv[3];
    close(fildes[1]);
    sigset_t mask;
    sigemptyset(&mask);
    sigaddset(&mask, SIGQUIT);
    sigset_t mask_sig;
    sigemptyset(&mask_sig);
    sigaddset(&mask_sig, SIGUSR2);
    ofstream file;
    int last_sig;
    char ch;
    file.open(argv[1], ios::app);
    //sigwait(&mask, &last_sig);
    sigwait(&mask_sig, &last_sig);
    while(read(fildes[0], &ch, 1) > 0){
        file << ch;
        killpg(0, SIGUSR1);
        sigwait(&mask_sig, &last_sig);
    }
    killpg(0, SIGUSR1);
    file.close();
    return 0;
}

标签: c++linuxsignalsclion

解决方案


推荐阅读