2014-02-19 2 views
0

У меня возникли проблемы с использованием fifos, я хочу, чтобы родитель создал 2 fifos и дождался, пока ребенок напишет введенную пользователем дату, время и системную дату и время вместе с uid to fifo 1 и после того, как он получил этот родитель, должен затем открыть файл журнала и записать содержимое в файл журнала и fifo2. и ребенок будет читать fifo2 и отображать результатКак я могу ожидать ввода от дочернего процесса с FIFO

#include<stdio.h> 
#include<fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include<time.h> 
int main() 
{ 
    int pid; 
    char buff[64]; 
    int ret,ret2; 
    FILE *cfp; 
    char fifoName[]="/tmp/testfifo23"; 
    char fifoName2[]="/tmp/testfifo22"; 
    FILE *cfp2; 
    FILE *pfp2; 
    char array[36],bufftime[36],buffread[64]; 
    FILE *pfp,*pfp2; 


    //Time Calculation 

    time_t rawtime; 

    time (&rawtime); 
    struct tm *timeinfo = localtime (&rawtime); 
    strftime(array, sizeof(array)-1, "%d.%m.%y %H:%M:%S", timeinfo); 

    // 

    if((pid=fork())>=0) 
    { 
     if(pid==0) //child Process 
     { 

      ret2 = mknod(fifoName, S_IFIFO | 0600, 0); 

      if(ret < 0) 
      { 
       printf("Unable to create fifos"); 
       exit(0); 
      } 
      ret2 = mknod(fifoName2, S_IFIFO | 0600, 0); 

      if(ret2 < 0) 
      { 
       printf("Unable to create fifos"); 
       exit(0); 
      } 

     } 
     else 
     { 
      sleep(3); 
      printf("Enter The date"); 

      if((fgets(buff,8,stdin)!=NULL)) 
      { 
       printf("Job done %s",buff); 
      } 
      printf("\n Enter The time"); 
      if((fgets(bufftime,8,stdin)!=NULL)) 
      { 

       printf("\nJob done %s",bufftime); 
      } 

      cfp = fopen(fifoName,"w"); 
      if(cfp == NULL) 
      { 
       printf("Unable to open fifo for writing"); 
       exit(0); 
      } 
      ret=fprintf(cfp,"%s %s %s %u",buff,bufftime,array,getuid()); 
      // fflush(cfp); 
      unlink(fifoName); 
      //close(fifoName); 
      cfp2= fopen(fifoName2,"r"); 

      if(cfp2 == NULL) 
      { 
       printf("Unable to open fifo for reading"); 
       exit(0); 
      } 
      ret=fscanf(cfp2,"%s",&buffread); 
      if(ret < 0) 
       printf("Error reading from named pipe"); 
      fclose(cfp2); 
      printf("%s",buffread); 
      unlink(fifoName); /* Delete the created fifo */ 
      unlink(fifoName2); 
      exit(0); 

     } 
     else 
     { 
      printf("Error Occured"); 

     } 


     return 0; 
    } 
    // Enter code here 

ответ

0

В коде вы представили, дочерний процесс открывает только две именованные каналы и существует. Если вы правильно отделите свой код, вы поймете проблему. Также вы хотели бы использовать «pipe()» для такого приложения.