C и fork();

Модератор: Модераторы разделов

DepeBo
Сообщения: 15

C и fork();

Сообщение DepeBo »

Есть функция и какая-либо переменная. В функции происходит fork. В форкнутом процессе
переменная меняет свое значение. После завершения форка, значение переменной становится
прежним. Как его сохранить?
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: C и fork();

Сообщение Sparky »

(DepeBo @ Пятница, 15 Июля 2005, 23:20) писал(а):Есть функция и какая-либо переменная. В функции происходит fork. В форкнутом процессе
переменная меняет свое значение. После завершения форка, значение переменной становится
прежним. Как его сохранить?

Например педать переменную как параметр ф-ии по ссылке.

Код: Выделить всё

void foo(int *);
int var;
// инициализация var
foo(&var)
{
 // изменяем переменную var
 }
// тут var  будет иметь новое значение...
Блог
--------------------

GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: C и fork();

Сообщение elide »

т.е. ты хочешь, чтоб child process мог менять переменные своего parent'a?
не. afaik, не прокатит такой вариант. (можешь поискать на тему shared sections в ELF - но я ни разу не слышал про такое)
тут надо думать про другие способы IPC.
слава роботам!
Спасибо сказали:
DepeBo
Сообщения: 15

Re: C и fork();

Сообщение DepeBo »

Мда, и правда, не хочет работать :(

Код: Выделить всё

#include <stdio.h>
#include <fcntl.h>

void foo(int *);
int value;

int main()
{
    value = 5;
    printf("value 1=%d\n", value);
    foo(&value);
    printf("value 2=%d\n", value);
    return 0;
}

void foo(int *parm)
{
    pid_t pid_m;
    pid_m = fork ();
    if (pid_m == 0)
    {
  *parm=10;
  _exit(1);
    }
}

% gcc -o forkbin forkk.c;./forkbin
var 1=5
var 2=5
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: C и fork();

Сообщение elide »

можно нескромный вопрос?
ты представляешь вообще, что делает форк?
суть, так сказать, происходящих процессов?
слава роботам!
Спасибо сказали:
Аватара пользователя
alphex_kaanoken
Сообщения: 30

Re: C и fork();

Сообщение alphex_kaanoken »

ххммм

тебе надо shared memory или какой другой объект IPC.

ибо fork это ПОЛНОЕ копирование процесса, те в том числе и переменных и стэка и адресного пространства и тд.

есстественно тебе так как ты хочешь просто не сделать.

да и ИМХО для таких вещей проще использовать pthread и для работы с ака общими переменными pthread_mutex - оно ИМХО оптимальней, тем более что в freebsd 5.x что в linux 2.6.xx треды уже настоящие, а не как до этого замаскированные форки =)
Don't try to look deeper, just look deeper than deep. ©
Спасибо сказали:
Arepo
Сообщения: 15

Re: C и fork();

Сообщение Arepo »

у меня возник вопрос, близкий по теме к этому топику, так что я не стал создавать новый.
Вопрос такой: Как мне принудительно завершить поток, созданный pthread_create()? Использовал pthread_cancel() но всё-равно не удаётся выделить больше 255 потоков на один запуск программы, даже если их убивать по ходу выполнения.

Arepo добавил в 17.07.2005 19:56

Фу, сам нашёл решение, нужно было всего-навсего сделать pthread_detach()
Спасибо сказали:
Аватара пользователя
alphex_kaanoken
Сообщения: 30

Re: C и fork();

Сообщение alphex_kaanoken »

да еще советую почитать - какк оно зависит от платформы на которой работает, тоже не маловажно.

дал бы ссылку да потерял там все опдробненько рассказано было. но всегда есть google =)
Don't try to look deeper, just look deeper than deep. ©
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: C и fork();

Сообщение Sparky »

(elide @ Суббота, 16 Июля 2005, 12:36) писал(а):т.е. ты хочешь, чтоб child process мог менять переменные своего parent'a?
не. afaik, не прокатит такой вариант. (можешь поискать на тему shared sections в ELF - но я ни разу не слышал про такое)
тут надо думать про другие способы IPC.

Да согласен - не подумал :wacko:
Блог
--------------------

GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
Спасибо сказали:
Аватара пользователя
LilFox
Сообщения: 137
Статус: ^^.,
ОС: Gentoo Linux

Re: C и fork();

Сообщение LilFox »

2DepeBo: В кодинге я не маста и не гуру, но с этим уже сталкивался...
fork() создает ДОЧЕРНИЙ процесс и копирует всю дату в него, меняется лишь pid и по желанию другие id. Чтобы использовать передачу данных между Дочерними процессами - использование fifo. Если нужно - исходник могу показать.
Best Wishes. LilFox
Won't someone help me find my little Clare.
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: C и fork();

Сообщение flook »

Могу посоветовать еще позвать clone с флажком CLONE_VM (или как-то так).
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
Alejandro
Сообщения: 98
Статус: Наследник "Астарота"

Re: C и fork();

Сообщение Alejandro »

(DepeBo @ Пятница, 15 Июля 2005, 23:20) писал(а):Есть функция и какая-либо переменная. В функции происходит fork. В форкнутом процессе
переменная меняет свое значение. После завершения форка, значение переменной становится
прежним. Как его сохранить?


Стеком пользоваться не пробовал?
Follow the white Rabbit!
Спасибо сказали:
Аватара пользователя
LilFox
Сообщения: 137
Статус: ^^.,
ОС: Gentoo Linux

Re: C и fork();

Сообщение LilFox »

Для Alejandro: Стек тут непоможет .
Best Wishes. LilFox
Won't someone help me find my little Clare.
Спасибо сказали:
Grom
Сообщения: 260
ОС: Debian Etch, RHEL-5.4

Re: C и fork();

Сообщение Grom »

pipe надо использовать. Что-то вроде этого:

int fd[2] ;
pid_t chpd ;

pipe(fd) ;
if( chpd=fork() ==-1 )
{
exit(-1) ;
}

if(chpd ==0) // дочерний процесс
{
close(fd[0]) ;
write(fd[1], data, sizeof(data)) ;
exit(0) ;
}
else // родительский процесс
{
close(fd[1]) ;
read(fd[0], data, sizeof(data));
}
Послужной список: Slackware-3.x, RedHat-4.x,5.x,6.x,7.x, FedoraCore-3, Debian Etch/Lenny
Осваиваю: RHEL-5.4
Спасибо сказали:
DepeBo
Сообщения: 15

Re: C и fork();

Сообщение DepeBo »

Всем спасибо за ответы :)
Воспользовался тредами
Спасибо сказали:
Аватара пользователя
Alejandro
Сообщения: 98
Статус: Наследник "Астарота"

Re: C и fork();

Сообщение Alejandro »

([MP]DisconNecT @ Среда, 27 Июля 2005, 22:40) писал(а):Для Alejandro: Стек тут непоможет .


Угу. Только я для подобных шуток частенько им пользоваля. А еще специальной областью памяти где и хранил нужные значения переменных
Follow the white Rabbit!
Спасибо сказали:
Аватара пользователя
LilFox
Сообщения: 137
Статус: ^^.,
ОС: Gentoo Linux

Re: C и fork();

Сообщение LilFox »

Для Alejandro: ХМ, код в студию, пожалуйста. Да вероятно можно и через стэк, но это может создать некотороые непредвиденные проблемы, или я ошибаюсь???

Пример чтения из пайпа, полная обработка : (взял с учебника по С++ для Unix)

Код: Выделить всё

#undef __DEPRECATED // Heh =), моё дополнение
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main (int argc, char** argv)
{
 pid_t child_pid;
 int fifo[2], status;
 char buf[80] = "";

 if (pipe(fifo)==-1 )perror("pipe"), exit(1);
 switch( child_pid = fork() )
  {
   case -1: perror("fork");
    exit(2);
   case 0 :close(fifo[0]);//Child Proc
        write(fifo[1], "Child executed",50);
        close(fifo[1]);
        exit(0);
  }
  close(fifo[1]);
  while (read(fifo[0], buf, 80)) cout<<buf<<endl;
  close (fifo[0]);
  if (waitpid(child_pid, &status,0) == child_pid && WIFEXITED(status))
   return WEXITSTATUS(status);
 return 3;//success
}


К сожалению коменты не сохранились, так как я сам когда-то делал что-то подобное, все их выпустил - так, что извеняйете если что не так.
Best Wishes. LilFox
Won't someone help me find my little Clare.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: C и fork();

Сообщение d_Sun »

([MP]DisconNecT @ Четверг, 28 Июля 2005, 5:28) писал(а):Пример чтения из пайпа, полная обработка : (взял с учебника по С++ для Unix)


:blink: Уф... А кто автор? Блин я куплю себе ее. :) Особенно понравилось вот это:

Код: Выделить всё

#include <iostream.h>
#include <stdio.h>
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
LilFox
Сообщения: 137
Статус: ^^.,
ОС: Gentoo Linux

Re: C и fork();

Сообщение LilFox »

d_Sun: Хм, да так и было написано. Главное, что работает и без всякий warnings собирается =). А книжка эта - Системное программирование на C++ для Unix, атор Теренс Чан издательство BHV, Киев, 1997.
Best Wishes. LilFox
Won't someone help me find my little Clare.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: C и fork();

Сообщение d_Sun »

([MP]DisconNecT @ Пятница, 29 Июля 2005, 5:24) писал(а):d_Sun: Хм, да так и было написано. Главное, что работает и без всякий warnings собирается =). А книжка эта - Системное программирование на C++ для Unix, атор Теренс Чан издательство BHV, Киев, 1997.


Та компилится то оно будет, но включение этих двух хедеров - маразм :D
Похоже название книги не соответствует содержимому :devil_2:
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
LilFox
Сообщения: 137
Статус: ^^.,
ОС: Gentoo Linux

Re: C и fork();

Сообщение LilFox »

Не скажи, эту книгу препод из Беркли писал ;), да и год как ты видишь не новый - это только издание 1997, а кого года книга - я не знаю.
А маразмом называется то, программирование на С++, если можно написать ничуть не хуже на С - можешь даже не спорить ;)) - все равно сам в этом убедишься.
Best Wishes. LilFox
Won't someone help me find my little Clare.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: C и fork();

Сообщение d_Sun »

([MP]DisconNecT @ Пятница, 29 Июля 2005, 11:25) писал(а):Не скажи, эту книгу препод из Беркли писал ;), да и год как ты видишь не новый - это только издание 1997, а кого года книга - я не знаю.
А маразмом называется то, программирование на С++, если можно написать ничуть не хуже на С - можешь даже не спорить ;)) - все равно сам в этом убедишься.


Я уже убедился в обратном :devil_2:
Моя подпись сильно длинная :)
Спасибо сказали: