2016-01-17 2 views
2

Я использую linux в качестве операционной системы и пытаюсь передать три процесса с помощью pipe и file. Он должен работать с любым файлом, наложенным на STDIN. И труба работает нормально, но второй процесс недоступен для записи одного символа в файл правильно или третий для чтения. Во-первых, конечно, я инициализирую функцию в виде семплера и полублока, а также открывающая труба. Я ценю любую помощь, потому что я понятия не имею.Interprocess Communication with pipe and file

if (!(PID[1] = fork())) { 

    int BUF_SIZE = 4096; 
    char d[BUF_SIZE]; 

    while (fgets (d, BUF_SIZE, stdin) != NULL) { 
     write (mypipe[1], &d, BUF_SIZE); 
    } 
} 

if (!(PID[2] = fork())) { 

    int reading_size = 0; 
    char r; 

    close (mypipe[1]); 
    semlock (semid1); 
    while (reading_size = read (mypipe[0], &r, 1)) { 

     if ((file = fopen ("proces2.txt", "w")) == NULL) { 
      warn ("error !!!"); 
      exit (1); 
     } 
     fputc (r, file); 
     fclose (file); 
     semunlock (semid2); 
    } 
} 

if (!(PID[3] = fork())) { 
    char x; 

    semlock (semid2); 
    do { 
     if ((plikProces3 = fopen ("proces2.txt", "r")) == NULL) { 
      warn ("Blad przy otwarciu pliku do odczytu !!!"); 
      exit (1); 
     } 

     i = getc (plikProces3); 
     o = fprintf (stdout, "%c", i); 
     fclose (plikProces3); 
     semunlock (semid1); 
    } while (i != EOF); 
} 

ответ

1

Что заставляет вас думать, что ребенок бежит первым? Вы не дождались завершения дочернего процесса, поэтому можете поразить EOF, прочитав файл, прежде чем предыдущий ребенок написал. Должен ли последний вызов fork() ждать, так что вы знаете, что файл был написан? В его нынешнем виде у вас есть 4 процесса, а не 3!

Затем вы закрываете mypipe [1] во втором дочернем процессе, который, поскольку он является раздвоенной копией, не закрывает трубу в первом ребенке. Вы также пытаетесь написать символы BUFSIZ, поэтому вы пытаетесь записать больше символов, чем было написано, попробуйте «написать (mypipe [1], & d, strlen (d));».

Это выглядит очень странно, чтобы foken() & fclose() в цикле чтения/записи символов. Вы действительно хотите снова открыть & переписать 1 символ в файл снова и снова?

Аналогично, файл process2, кажется, снова открывается, поэтому первый символ внутри будет записываться снова и снова, если он не пуст.

Должны быть другие ошибки, но это должно помочь вам пока.

+0

О, я не хочу обескураживать, сначала fork() и трубы обязательно будут странными :) – Rob11311