2013-05-08 91 views
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); 

} 

回答

0

嗯,我已經想通了。問題出在主要過程中。我應該在處理程序中使用異步安全函數。