Доброго времени суток!Вот тут странноя штука вышла с пайпом - написал простенькое перенаправление вывода, причем работает :) но, прихорашивая текст, обнаружил странность.
В общем, создаю два пайпа и два потомка, у потомка stdin назначаю на pipe[0], stdout - на файл, который в потомке и создается. Вот эта функция работает после форка для потомка.
int run_child(char *output_file, int *fd)
{
int out;
int c;
dup2(fd[0], 0);
close(fd[0]);
close(fd[1]);
if(-1 != (out = open(output_file, O_CREAT | O_TRUNC | O_WRONLY, S_IREAD | S_IWRITE))){
dup2(out, 1);
close(out);
execlp("cat", "cat", NULL);
}
exit(0);
return 0;
}
Родитель для каждого потомка пишет сообщение в пайп, закрывает дескрипторы и ждет завершения потомков.
for(i = 0; i < 2; i++){
if(0 > (task[i].pid = fork())){
printf("Fork error !\n");
exit(2);
}
if(task[i].pid == 0)
run_child(output_file[i], task[i].fd);
/************************* Здесь пишем ***********/
close(task[i].fd[0]);
write(task[i].fd[1], big_string, strlen(big_string));
close(task[i].fd[1]);
/*************************************************/
}
for(i = 0; i < 2; i++) /* waitpid(task[i].pid, &task[i].status, 0);
Все чудненько, строка уходит в соответствующий файл, Но если вынести запись в пайп из цикла(выделенный блок), то есть сначала создать всех потомков, а потом чего-то им послать, то начинаются странности: файлы либо нулевые, либо длиной 4096(зависит от размера строки-сообщения),
родитель намнртво встает на waitpid().
Программка махонькая, здесь она почти вся.
В принципе, она в таком вот виде работает, но я понимаю, что что-то упускаю. Вроде, по книжке делал :)
В общем, сам не пойму, а где еще найти таких гуру как здесь - не знаю.
Помогите, плиз, разобраться,