The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"странность с pipe()"
Отправлено programmator, 22-Апр-05 19:01 
Доброго времени суток!

Вот тут странноя штука вышла с пайпом - написал простенькое перенаправление вывода, причем работает :) но, прихорашивая текст, обнаружил странность.

В общем, создаю два пайпа и два потомка, у потомка 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().

Программка махонькая, здесь она почти вся.
В принципе, она в таком вот виде работает, но я понимаю, что что-то упускаю. Вроде, по книжке делал :)

В общем, сам не пойму, а где еще найти таких гуру как здесь - не знаю.
Помогите, плиз, разобраться,

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру