C Linux. Два процесса из одного родительского
Может ли кто-нибудь описать механизм создания из одного родительского процесса двух других? Я пробовал примерно так:
if((one /*первый потомок*/ = fork()) != 0)
{
if((two /*второй*/ = fork()) != 0)
... // также родительский
else
... // второй потомок
}
else {
... //действия первого потомка
}
Проверки на ошибку fork() в настоящем коде есть. В нем вообще происходит передача строк из потомков к родителю. Со второго потомка все передается, но с первого - нет. Хотя думаю, конструкция сама по себе неправильная.
Вот код программы (исправленный вариант, но не верно работающий):
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#define READ 0
#define WRITE 1
#define SIZE 1024
void main(int argc, char **argv)
{
pid_t pid1, pid2;
int fd[2], fdNew[2];
char* str[2];
if(pipe(fd) == -1)
{
perror("Pipes!");
exit(0);
}
if((pid1 = fork()) < 0)
{
perror("First!");
exit(1);
}
if(pid1 != 0) //родительский процесс!!!
{
close(fd[WRITE]);
read(fd[READ], str[0], SIZE);
close(fd[READ]);
printf("%s\n", str[0]);
if(pipe(fdNew) == -1)
perror("Second pipe!");
if((pid2 = fork()) < 0)
{
perror("Sec!");
exit(2);
}
if(pid2 != 0)
{
close(fdNew[WRITE]);
read(fdNew[READ], str[1], SIZE);
close(fdNew[READ]);
printf("%s\n", str[1]);
}
else
{
close(fdNew[READ]);
str[1] = " world!";
write(fdNew[WRITE], str[1], strlen(str[1]) + 1);
close(fdNew[WRITE]);
}
}
else
{
close(fd[READ]);
str[0] = "WELL WELL WELL";
write(fd[WRITE], str[0], strlen(str[0]) + 1);
close(fd[WRITE]);
}
}
Программа по идее должна вывести "WELL WELL WELL world!". Но надпись выводится так 4 раза, при этом первые два раза str[0] инициализирован (т.е. в ней хранится "Well well well"), а остальные два раза выводятся крякозябры.