C 写入管道信号同步

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发送了信

以下是我想做的: (这是更大任务的一部分) 我被困在一开始

我创建了主进程,它分叉p1、p2进程,并使用execlp(独立程序)。他们应该从p1.txt(进程p1)和p2.txt(进程p2)中每行读取一个单词,然后将其写入管道。然后在主进程中,proc_pr被分叉(我没有它的源代码),只要它希望从管道中读取一个单词,然后将其写入第二个管道,就应该向它们发送SIGUSR 1

我曾尝试在p1中编写简单的代码,但大多数情况下都不起作用,只是在某些情况下。从proc_pr的输出可以看出,它向p1发送了信号,然后什么也没发生。 我见过使用open()、read()和lseek()的解决方案,但我使用了fopen()和fgets()。 感谢您的帮助

#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);
}

嗯,我已经弄明白了。问题出在主要过程中。我可能应该在处理程序中使用异步安全函数