0

这就是我想做的事情:(这是更大任务的一部分)而且我被困在它的开始。

我创建了分叉 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);

}
4

1 回答 1

0

嗯,我已经想通了。问题出在主进程中。我可能应该在处理程序中使用异步安全函数。

于 2013-05-11T07:49:27.633 回答