c++ - 如何使用 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;
}