C 写入管道信号同步
以下是我想做的: (这是更大任务的一部分) 我被困在一开始 我创建了主进程,它分叉p1、p2进程,并使用execlp(独立程序)。他们应该从p1.txt(进程p1)和p2.txt(进程p2)中每行读取一个单词,然后将其写入管道。然后在主进程中,proc_pr被分叉(我没有它的源代码),只要它希望从管道中读取一个单词,然后将其写入第二个管道,就应该向它们发送SIGUSR 1 我曾尝试在p1中编写简单的代码,但大多数情况下都不起作用,只是在某些情况下。从proc_pr的输出可以看出,它向p1发送了信号,然后什么也没发生。 我见过使用open()、read()和lseek()的解决方案,但我使用了fopen()和fgets()。 感谢您的帮助C 写入管道信号同步,c,linux,signals,pipe,C,Linux,Signals,Pipe,以下是我想做的: (这是更大任务的一部分) 我被困在一开始 我创建了主进程,它分叉p1、p2进程,并使用execlp(独立程序)。他们应该从p1.txt(进程p1)和p2.txt(进程p2)中每行读取一个单词,然后将其写入管道。然后在主进程中,proc_pr被分叉(我没有它的源代码),只要它希望从管道中读取一个单词,然后将其写入第二个管道,就应该向它们发送SIGUSR 1 我曾尝试在p1中编写简单的代码,但大多数情况下都不起作用,只是在某些情况下。从proc_pr的输出可以看出,它向p1发送了信
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#define MAXLENGTH 150 //definujme si maximalnu dlzku retazca
int fd; int data_processed; //file deskriptor a premenna na pocitanie precitanych dat
char buff[150]; //buffer
FILE *f; //smernik na prud suboru
/* odchytenie signalu, subor je uz otvoreny a fd nacitany */
void odchytenie(int sig)
{
/* read a line */
if ( fgets ( buff, sizeof buff, f ) != NULL )
{
/* write the line */
fputs ( buff, stdout );
/* store the word into pipe */
write(fd,buff,strlen(buff));
}
else
{
//do something to stop the process and close the file
}
}
int main(int argc, char *args[])
{
/* prevedieme retazec z parametra na cislo deskriptora pipe na zapis */
fd = atoi(args[1]);
/* otvorime subor p1 */
f=fopen("p1.txt","r");
/* zabezpeci odchytenie signalu */
(void) signal(SIGUSR1,odchytenie);
/* pocka na signal, proces sa neukonci, ani sa nezavrie subor */
while(1)
{
sleep(1);
}
/* close the file */
fclose(f);
/* exit with value 0 */
exit(0);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义最大长度150//definujme si maximalnu dlzku retazca
int-fd;已处理的int数据//文件桌面抄写器a premenna na pocitanie precitanych dat
字符buff[150]//缓冲器
文件*f//斯默尼克·纳普拉德·苏布鲁
/*这是一个信号,但不是一个信号*/
无效odchytenie(内部信号)
{
/*读一行*/
if(fgets(buff,sizeof buff,f)!=NULL)
{
/*写一行*/
FPUT(浅黄色、标准色);
/*将单词存储到管道中*/
写入(fd、buff、strlen(buff));
}
其他的
{
//执行某些操作以停止进程并关闭文件
}
}
int main(int argc,char*args[]
{
/*prevedieme retazec z parametra na cislo deskriptora pipe na zapis*/
fd=atoi(args[1]);
/*奥特沃里姆酒店*/
f=fopen(“p1.txt”,“r”);
/*扎贝茨佩奇·奥德希特尼·斯格诺*/
(无效)信号(SIGUSR1,odchytenie);
/*pocka na信号,处理neukonci,处理nezavrie subor*/
而(1)
{
睡眠(1);
}
/*关闭文件*/
fclose(f);
/*以值0退出*/
出口(0);
}
嗯,我已经弄明白了。问题出在主要过程中。我可能应该在处理程序中使用异步安全函数