#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