Дочерний процесс после fork наследует открытые файловые дескрипторы родителя.См. man 2 fork
.
Хорошо.Мой первый совет для вас - собрать флаги -Wall -Wextra -pedantic
, чтобы получить все предупреждения.Теперь мои изменения в вашем коде:
/*removed char pipe_readend[12];*/
char * arg[2] = {"test2", NULL}; /*first argument of program should be always it's name*/
char message[3] = {'h', 'i', '\0'}; /*c-string should be always terminated by '\0'*/
/*...*/
case 0:
/* child actions */
close(pfd[1]); /* close write end */
close(STDIN_FILENO); /*close standard input descriptor*/
dup(pfd[0]); /*now standard input will be pfd[0]*/
execve("test2", arg, NULL); /* start new process */
break;
и test2.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (void){
char msg[3];
read(STDIN_FILENO, msg, 3); /*read from standard input*/
printf("test2: %s\n", msg);
return 0;
}
Итак, подведем итог: после разветвления вы закрываете стандартный входной дескриптор и дублируете pfd [0],который станет новым стандартным вводом.Затем вызовите execve (), который использует pfd [0] в качестве стандартного ввода.Подробнее смотрите в man 2
функций fork, execve, pipe
.