【发布时间】:2025-09-27 18:40:01
【问题描述】:
我需要使用 SIGUSR1 和 SIGUSR2 并从管道中读取一些文本。一个线程必须读取奇数符号,另一个线程必须读取偶数符号。主线程打开一个 .txt 文件并将信息写入管道,2 个线程从管道读取符号并写入其 .txt 文件。 我尝试使用 sigwait,但它看起来无法正常工作。有任何想法吗? 非常感谢)
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
#include <printf.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <cerrno>
#include <signal.h>
#include <fcntl.h>
using namespace std;
static bool a=false;
static int c;
main(int argc, char** argv)
{
int fildes[2];
char ch,ch1,ch2;
FILE *fp,*f1,*f2;
int stat,sig;
sigset_t set1;
sigset_t set2;
sigemptyset(&set1);
sigemptyset(&set2);
sigaddset(&set1,SIGUSR1);
sigaddset(&set2,SIGUSR2);
sigprocmask(SIG_BLOCK,&set1,NULL);
sigprocmask(SIG_BLOCK,&set2,NULL);
pid_t p1,p2;
pipe(fildes);
cout<<argv[1]<< " " <<argv[2]<< " " <<argv[3]<<endl;
fp=fopen(argv[1],"r");
f1=fopen(argv[2],"a");
f2=fopen(argv[3],"a");
int chet=2;
p1=fork();
if (!p1)
{
do
{
sigwait(&set1,&sig);
read(fildes[0], &ch1, 1);
printf("%c",ch1);
fprintf(f1,"%c",ch1);
}
while(!a);
exit(0);
}
p2=fork();
if (!p2)
{
do
{
sigwait(&set2,&sig);
read(fildes[0], &ch2, 1);
printf("%c",ch2);
fprintf(f2,"%c",ch2);
}
while(!a);
exit(0);
}
else
{
while(!feof(fp))
{
ch=fgetc(fp);
write(fildes[1],&ch,1);
if(chet%2==0)
kill(p1,SIGUSR1);
else kill(p2,SIGUSR2);
chet++;
//sleep(1/10);
}
a=true;
wait(&stat);
close(fildes[0]);
close(fildes[1]);
fclose(f1);
fclose(f2);
fclose(fp);
}
}
【问题讨论】:
-
到底发生了什么?看起来它不能正常工作是没有足够的信息
-
您的代码有一个问题:它没有任何错误处理。零。
-
我感谢他从问题中删除了错误处理代码以使其更具可读性
-
@user2717954,没有任何反应,如果wait()函数没有被注释,程序一直等待,如果我注释它,程序结束,如果我添加类似kill(p2,SIGUSR2)的东西;在第二个叉子中,它显示我的文本,但所有文本,也不是奇数或偶数符号,所以信息没问题
标签: linux multiprocessing signals