После разветвления дочернего процесса, но перед вызовом execve
вам придется вызвать dup2(2)
, чтобы перенаправить дескриптор дочернего процесса * stdin
в конец чтения вашего канала.Вот простой кусок кода без особой проверки ошибок:
pipe(pfds_1); /* first pair of pipe descriptors */
pipe(pfds_2); /* second pair of pipe descriptors */
switch (fork()) {
case 0: /* child */
/* close write ends of both pipes */
close(pfds_1[1]);
close(pfds_2[1]);
/* redirect stdin to read end of first pipe, 4 to read end of second pipe */
dup2(pfds_1[0], 0);
dup2(pfds_2[0], 4);
/* the original read ends of the pipes are not needed anymore */
close(pfds_1[0]);
close(pfds_2[0]);
execve(...);
break;
case -1:
/* could not fork child */
break;
default: /* parent */
/* close read ends of both pipes */
close(pfds_1[0]);
close(pfds_2[0]);
/* write to first pipe (delivers to stdin in the child) */
write(pfds_1[1], ...);
/* write to second pipe (delivers to 4 in the child) */
write(pfds_2[1], ...);
break;
}
Таким образом, все, что вы пишете в первый канал из родительского процесса, будет доставлено дочернему процессу через дескриптор 0
(stdin
), и все, что вы пишете из второго канала, будет также доставлено в дескриптор 4
.