Разъяснение о родительском процессе, пишущем сообщение дочернему процессу с использованием простого канала

#c #linux #operating-system #pipe #ipc

#c #linux #операционная система #канал #ipc

Вопрос:

Это программа на языке Си, в которой родительский процесс пытается записать сообщение своему дочернему процессу с помощью простого канала. Получен ожидаемый результат.

Согласно коду, родительский вызов wait() и ожидает, пока дочерний процесс завершит работу (вернется).

Кроме того, дочерний процесс вызывает read() , который ожидает, что что-то будет записано через другой конец канала?

Таким образом, не должны ли оба процесса продолжать ждать друг друга и вызывать взаимоблокировку? Как возможно, чтобы программа работала правильно?

 #include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define MSGSIZE 16
char *msg1 = "Hello,Once";
char *msg2 = "Hello,Twice";
char *msg3 = "Hello,Thrice";
int main()
{
    char buff[MSGSIZE];
    int pi[2],pid,nbytes;
    if(pipe(pi) < 0) _exit(1);
    if((pid=fork()) > 0)
    {
        close(pi[0]);
        write(pi[1],msg1,MSGSIZE);
        write(pi[1],msg2,MSGSIZE);
        write(pi[1],msg3,MSGSIZE);
        close(pi[1]); 
        wait(NULL);
    }
    else
    {
        close(pi[1]);
        while((nbytes = read(pi[0],buff,MSGSIZE)) > 0) printf("%sn",buff);
        printf("Reading Completedn");
        close(pi[0]);
        if(nbytes != 0) _exit(2);
        
    }   
    return 0;
}
 

Комментарии:

1. close(pi[1]); В родительском процессе дочерний read процесс вернется EOF после считывания всех данных. В этот момент дочерний процесс завершит работу и, следовательно, родительский wait процесс разблокируется.

2. У вашего кода есть другая проблема: для записи сообщений существует доступ за пределы строк, потому что их размер не всегда равен MSGSIZE .

3. Понял. Tnx @kaylum