Мне нужно использовать SIGUSR1 и SIGUSR2 и прочитать текст из трубы. Один поток должен читать нечетные символы, а другой должен читать четные символы. Основной поток открывает файл .txt и записывает информацию в канал, а 2 потока считывают символы из канала и записывают в их .txt-файлы. Я попытался использовать сигвайт, но похоже, что он работает неправильно. Есть идеи? Большое спасибо)Сигналы Linux C
#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
В коде есть что-то не так: в нем нет обработки ошибок. Нуль. –
Я дал ему кредит, что он удалил код обработки ошибок из вопроса, чтобы сделать его более читаемым – user2717954