The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Обмен по pipe между процессами"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Обмен по pipe между процессами" 
Сообщение от Shourikun Искать по авторуВ закладки(ok) on 16-Ноя-05, 01:05  (MSK)
Подскажите пожалуйста, как заставить дочерний, exec()-нутый процесс
общаться с родителем через pipe. Совсем запутался в изобилии
документации :(
Вроде бы надо передать дочернему значения файловых дескрипторов,
которые pipe() инициализирует, а как - не могу додуматься.
Или может, есть другой способ заставить дочерний процесс
писать в pipe, созданный родителем?

PS
Извините, если неправильно задал вопрос - первый раз тут пишу :)

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

1. "Обмен по pipe между процессами" 
Сообщение от dimus emailИскать по авторуВ закладки(??) on 16-Ноя-05, 09:19  (MSK)
>Подскажите пожалуйста, как заставить дочерний, exec()-нутый процесс
>общаться с родителем через pipe. Совсем запутался в изобилии
>документации :(
>Вроде бы надо передать дочернему значения файловых дескрипторов,
>которые pipe() инициализирует, а как - не могу додуматься.
>Или может, есть другой способ заставить дочерний процесс
>писать в pipe, созданный родителем?
>
>PS
>Извините, если неправильно задал вопрос - первый раз тут пишу :)

На самом деле все довольно просто. Самый простой способ - использовать команду popen для открытия пипы к команде и pclose для закрытия.
Example:

#include <stdio.h>

int     main( int argc, char* argv[] )
{
        FILE*   fp;
        // Откроем пипу к команде wc на запись
        fp = popen("wc", "w" );
        if( fp )
        {
                fprintf( fp, "My string\n" );
                pclose( fp );
        }
        else
        {
                perror("popen");
                return  1;
        }
        return  0;
}

Недостатки этого метода - для выполнения команды запускается шелл, что нужно далеко не всегда.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Обмен по pipe между процессами" 
Сообщение от dimus emailИскать по авторуВ закладки(??) on 16-Ноя-05, 09:47  (MSK)
pipe Parent to child
//------------------------------------------------------------
#include <stdio.h>      // printf
#include <string.h>     // memset
#include <sys/types.h>  // for pid_t
#include <unistd.h>     // fork, read, write

char    msg[] = "hello from parent process";
char    buf[100];

int     main( int argc, char* argv[] )
{
        int     filedes[2];
        pid_t   pid;

        //      Создадим пару файловых дескрипторов для пипы
        if( pipe( filedes ) == -1 )
        {
                perror("pipe");
                return  1;
        }

        //      Создадим процесс-потомок
        pid = fork();

        //      Оценим стуацию
        if( pid == -1 )
        {
                perror( "fork" );
                return  1;
        }
        //      Родитель
        if( pid )
        {
                // filedes[0] используется для чтения
                close( filedes[0] );
                printf( "Parent: sending message to child [ %d ]\n", pid );
                write( filedes[1], msg, sizeof(msg) );
                close( filedes[1] );
        }
        //      Потомок
        else
        {
                // filedes[1] используется для записи
                close( filedes[1] );
                memset( buf, 0, sizeof(buf) );
                read( filedes[0], buf, sizeof(msg) );
                close( filedes[0] );
                printf( "Child: parent say: %s\n", buf );
        }

        return  0;
}

В этой проге есть недоработки, но общий принцип примерно такой.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Обмен по pipe между процессами" 
Сообщение от Shourikun Искать по авторуВ закладки(ok) on 16-Ноя-05, 10:44  (MSK)
dimus, прошу прощения, наверное я должен был акцентировать то, что
дочерний процесс именно exec-нутый, то есть это вторая программа-клиент,
которая должна будет посылать первой программе-серверу весточку через
pipe.

Так что приведенные Вами коды, к сожалению, не решат проблему (в первом
можно только команды shell, во втором использован fork() )


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Обмен по pipe между процессами" 
Сообщение от Forth Искать по авторуВ закладки(??) on 16-Ноя-05, 12:31  (MSK)
>можно только команды shell, во втором использован fork() )
В этом случае можно открывать pipe, по затем закрыть например stdin, продублировать дескриптор, закрыть ненужный старый, а новый дубль будет открыт заместо stdin, тогда после exec программа будет знать, через что ей общаться с родителем.


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Обмен по pipe между процессами" 
Сообщение от dimus emailИскать по авторуВ закладки(??) on 17-Ноя-05, 09:33  (MSK)
>dimus, прошу прощения, наверное я должен был акцентировать то, что
>дочерний процесс именно exec-нутый, то есть это вторая программа-клиент,
>которая должна будет посылать первой программе-серверу весточку через
>pipe.
>
>Так что приведенные Вами коды, к сожалению, не решат проблему (в первом
>
>можно только команды shell, во втором использован fork() )

Почему только шелл? Любые команды. Просто при их запуске вызывается шелл, если конечно man popen не врет.

Во втором случае использован форк, но если мы запустим потом exec, то процесс унаследует дескриптор стандартного ввода от своего предка. Т.е. после форка, но перед exec нам надо продублировать выходной конец пипы на стандартный ввод дочернего процесса. См. ман по функции dup2.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Forth и dimus, спасибо большое!" 
Сообщение от Shourikun Искать по авторуВ закладки(??) on 19-Ноя-05, 03:35  (MSK)
Переназначение стандартных потоков сработало с первого раза! :)

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

Спасибо вам, dimus и Forth, за объяснения. Я уже натыкался на http://www.opennet.me/base/patch/dup2.txt.html , но не понял тогда, что там как раз моя проблема описана. Цитаты там порезаны максимально - борьба с оверквотингом, это хорошо, конечно, но в меру :)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]




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

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