#c #wait #named-pipes
#c #подождите #именованные каналы
Вопрос:
Это основное в test1.c:
int main(int argc, char *argv[])
{
int fd1,i, *foo;
pid_t childpid;
mkfifo("myfifo1", 0777);
foo = malloc(10*sizeof(int));
childpid=fork();
if (childpid== -1){
perror("Failed to forkn");
exit(1);
}
if (childpid==0) {
execlp(argv[1],argv[1],(char *) NULL);
perror("exec failure ");
exit(1);
}
else {
wait(NULL);
fd1 = open("myfifo1", O_RDONLY, 0);
for (i=0; i<10; i ) {
read(fd1, amp;foo[i], sizeof(int));
}
for (i=0; i<10; i ) {
printf("%dn", foo[i]);
}
}
close(fd1);
}
и это главное в test2.c:
int main(int argc, char *argv[])
{
int fd1, i, *foo;
fd1 = open("myfifo1", O_WRONLY);
if (fd1==-1) printf("errorn");
foo = malloc(10*sizeof(int));
for (i=0; i<10; i ) {
write(fd1, amp;i, sizeof(int));
}
printf("n");
close(fd1);
}
Когда я запускаю ./test1 ./test2 программа зависает. Я предполагаю, что это происходит потому, что в test2.c открывается только один конец канала, и программа ожидает, пока это сделает другой. Однако этого никогда не происходит из-за:
wait(NULL)
И действительно, если я удалю эту команду, программа будет работать нормально. Однако я подумал, что ожидание всегда полезно, и это мешает нам создавать процессы-зомби. Я ошибаюсь во всем этом? Есть ли какой-либо способ сохранить команду ожидания и заставить программу работать?
Заранее спасибо!
Комментарии:
1. Да, wait() должен вызываться родительским процессом. Но почему вы хотите вызвать его перед чтением в FIFO? Вы можете вызвать его после чтения FIFO. В качестве примечания, malloc() бесполезен в test2.c, поскольку вы не используете foo.
2. Я думаю, что сначала я должен писать, а затем читать. Вот почему я вызвал его перед чтением, чтобы дождаться, пока дочерний элемент не запишет. Да, вы правы насчет malloc, мой плохой.
3. Чтение блокируется до тех пор, пока что-то не будет записано на другой стороне FIFO
4. Хорошо, это имеет смысл. Большое спасибо