Что случилось с файловым дескриптором и исполнителем?

#file #c #bind #exec #fork

Вопрос:

У меня есть один родительский процесс, и я создаю с помощью вилки 2 таких дочерних процесса.

 for (int i = 0; i < 2; i  ) // loop will run n times (n=2)
{
    pid = fork();
    if (pid == 0)
    {
        printf("[son] pid %d from [parent] pid %dn", getpid(), getppid());
        execl("merge", "merge", fifo1[i], fifo2[i], "2", NULL);
        exit(0);
    }
}
 

FIFO называются трубами. Я вызываю execl и в исполняемом файле слияния открываю именованные каналы вот так.

 if ((readfd = open(argv[1], O_RDONLY) < 0) {
    perror("server: can't open read fifo");
}
server(readfd);
 

Я также пишу что-то от родителя детям вот так (я открывал fds ранее, я не писал это здесь).:

 for (int = 0; i < 2; i  ) {
    n = strlen(word);
    if (write(fd_write[i], word, n) != n) {
        perror("client: filename write error");
    }
}
 

Я хочу написать что-то на одном дочернем элементе и что-то ЕЩЕ на другом, но оба этих дочерних элемента имеют один и тот же файловый дескриптор(чтение) 4, и это похоже на то, что я пишу в одном и том же именованном канале. Что я делаю не так?