LINUX.ORG.RU

Re: как передать данные от родительского к дочернему процессу

Слишком общий вопрос.

В зависимости от потребностей: signal, pipe, named pipe, SystemV ipc(message queue or shared memory), POSIX shared memory, mmap.

Die-Hard ★★★★★ ()

Re: Re: как передать данные от родительского к дочернему процессу

Нужно передать строку (char *) полученную по сокету в дочернем процессе в родительский процесс и получить результат обработки этой строки (char *)

evgeny ()

Re: Re: Re: как передать данные от родительского к дочернему процессу

Тогда два пайпа. Наверное, на селектах, чтобы зря не спать.

А если строки ОЧЕНЬ длинные, а длина их более-менее известна, то можно перед форком сказать

#define MAXINT 1024

char *buf;

buf=mmap (0, MAXINT, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, 0, 0);

и теперь читать/писать в buf, а синхронизироваться пайпами с read/write или сигналами

Die-Hard ★★★★★ ()

Re: Re: Re: Re: как передать данные от родительского к дочернему процессу

Да, чушь, конечно:

#define MAXINT 1024

Такие строки быстрее через пайпы гонять.

Если хотя бы

#define MAXINT 1024*1024

тогда имеет смысл память шарить

Die-Hard ★★★★★ ()

Re: Re: Re: Re: как передать данные от родительского к дочернему процессу

Спасибо большое.

Только еще мленькая просьба, кинь если не сильно трудно коротенький пример с пайпами...

Еще раз спасибо Я просто первый раз в жизни с этим общаюсь

evgeny ()

Re: Re: Re: Re: Re: Re: как передать данные от родительского к дочернему процессу

Простейший вариант, без селектов и обработки EINTR для read/write:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

char buf[1024];

int main(void)
{
int l;
    int sig1[2],sig2[2];

    if(pipe(sig1)){
       perror("pipe1");
       return 1;
    }
    if(pipe(sig2)){
       perror("pipe2");
       return 2;
    }

    switch(fork()){
       case -1:
           perror("fork");
           return 3;
       case 0:/*Child*/
           close(sig1[0]);
           close(sig2[1]);
           strcpy(buf,"Hello, papa!");
           l=strlen(buf);

           write(sig1[1],&l,sizeof(int));
           write(sig1[1],buf,l+1);

           read(sig2[0],&l,sizeof(int));
           read(sig2[0],buf,l);

           printf("Child from the father: '%s'\n",buf);
           return 0;
       default:/*The father*/
           close(sig1[1]);
           close(sig2[0]);
           break;
    }

    read(sig1[0],&l,sizeof(int));
    read(sig1[0],buf,l);
    printf("Father from child: '%s'\n",buf);

    strcpy(buf,"Hello, baby!");
    l=strlen(buf);

    write(sig2[1],&l,sizeof(int));
    write(sig2[1],buf,l+1);

    wait(&l);
    return 0;
}

Die-Hard ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.