Форум — Development как передать данные от родительского к дочернему процессу 0 0 Люди, кто может подскажите как на С/C++ под LINUX толково организовать передачу данных от дочернего (созданного с помощью fork) процесса к родитльскому и обратно. Спасибо!!! Ссылка
Слишком общий вопрос. В зависимости от потребностей: signal, pipe, named pipe, SystemV ipc(message queue or shared memory), POSIX shared memory, mmap. Die-Hard ★★★★★ (27.10.04 21:18:39 MSK) Показать ответ Ссылка
Ответ на: комментарий от Die-Hard 27.10.04 21:18:39 MSK Нужно передать строку (char *) полученную по сокету в дочернем процессе в родительский процесс и получить результат обработки этой строки (char *) evgeny (27.10.04 21:58:20 MSK) автор топика Показать ответ Ссылка
Ответ на: комментарий от evgeny 27.10.04 21:58:20 MSK Тогда два пайпа. Наверное, на селектах, чтобы зря не спать. А если строки ОЧЕНЬ длинные, а длина их более-менее известна, то можно перед форком сказать #define MAXINT 1024 char *buf; buf=mmap (0, MAXINT, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, 0, 0); и теперь читать/писать в buf, а синхронизироваться пайпами с read/write или сигналами Die-Hard ★★★★★ (27.10.04 22:10:00 MSK) Показать ответы Ссылка
Ответ на: комментарий от Die-Hard 27.10.04 22:10:00 MSK Да, чушь, конечно: #define MAXINT 1024 Такие строки быстрее через пайпы гонять. Если хотя бы #define MAXINT 1024*1024 тогда имеет смысл память шарить Die-Hard ★★★★★ (27.10.04 22:13:21 MSK) Ссылка
Ответ на: комментарий от Die-Hard 27.10.04 22:10:00 MSK Спасибо большое. Только еще мленькая просьба, кинь если не сильно трудно коротенький пример с пайпами... Еще раз спасибо Я просто первый раз в жизни с этим общаюсь evgeny (27.10.04 22:23:54 MSK) автор топика Показать ответ Ссылка
Ответ на: комментарий от evgeny 27.10.04 22:23:54 MSK смысле первый вариант когда 2 пайпа. evgeny (27.10.04 22:25:34 MSK) автор топика Показать ответ Ссылка
Ответ на: комментарий от evgeny 27.10.04 22:25:34 MSK Простейший вариант, без селектов и обработки 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 ★★★★★ (27.10.04 22:51:48 MSK) Показать ответ Ссылка
Ответ на: комментарий от Die-Hard 27.10.04 22:51:48 MSK Все ОГРОМНОЕ спасибо!!! Дальше я сам потихоньку разберусь!!! Спасибо еще раз evgeny (27.10.04 23:00:24 MSK) автор топика Ссылка