C и fork();
Модератор: Модераторы разделов
-
DepeBo
- Сообщения: 15
C и fork();
Есть функция и какая-либо переменная. В функции происходит fork. В форкнутом процессе
переменная меняет свое значение. После завершения форка, значение переменной становится
прежним. Как его сохранить?
переменная меняет свое значение. После завершения форка, значение переменной становится
прежним. Как его сохранить?
-
Sparky
- Сообщения: 604
- Статус: core dumped
- ОС: Plan 9
Re: C и fork();
(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++
--------------------
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();
т.е. ты хочешь, чтоб child process мог менять переменные своего parent'a?
не. afaik, не прокатит такой вариант. (можешь поискать на тему shared sections в ELF - но я ни разу не слышал про такое)
тут надо думать про другие способы IPC.
не. afaik, не прокатит такой вариант. (можешь поискать на тему shared sections в ELF - но я ни разу не слышал про такое)
тут надо думать про другие способы IPC.
слава роботам!
-
DepeBo
- Сообщения: 15
Re: C и fork();
Мда, и правда, не хочет работать 
Код: Выделить всё
#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();
можно нескромный вопрос?
ты представляешь вообще, что делает форк?
суть, так сказать, происходящих процессов?
ты представляешь вообще, что делает форк?
суть, так сказать, происходящих процессов?
слава роботам!
-
alphex_kaanoken
- Сообщения: 30
Re: C и fork();
ххммм
тебе надо shared memory или какой другой объект IPC.
ибо fork это ПОЛНОЕ копирование процесса, те в том числе и переменных и стэка и адресного пространства и тд.
есстественно тебе так как ты хочешь просто не сделать.
да и ИМХО для таких вещей проще использовать pthread и для работы с ака общими переменными pthread_mutex - оно ИМХО оптимальней, тем более что в freebsd 5.x что в linux 2.6.xx треды уже настоящие, а не как до этого замаскированные форки =)
тебе надо 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();
у меня возник вопрос, близкий по теме к этому топику, так что я не стал создавать новый.
Вопрос такой: Как мне принудительно завершить поток, созданный pthread_create()? Использовал pthread_cancel() но всё-равно не удаётся выделить больше 255 потоков на один запуск программы, даже если их убивать по ходу выполнения.
Arepo добавил в 17.07.2005 19:56
Фу, сам нашёл решение, нужно было всего-навсего сделать pthread_detach()
Вопрос такой: Как мне принудительно завершить поток, созданный pthread_create()? Использовал pthread_cancel() но всё-равно не удаётся выделить больше 255 потоков на один запуск программы, даже если их убивать по ходу выполнения.
Arepo добавил в 17.07.2005 19:56
Фу, сам нашёл решение, нужно было всего-навсего сделать pthread_detach()
-
alphex_kaanoken
- Сообщения: 30
Re: C и fork();
да еще советую почитать - какк оно зависит от платформы на которой работает, тоже не маловажно.
дал бы ссылку да потерял там все опдробненько рассказано было. но всегда есть google =)
дал бы ссылку да потерял там все опдробненько рассказано было. но всегда есть google =)
Don't try to look deeper, just look deeper than deep. ©
-
Sparky
- Сообщения: 604
- Статус: core dumped
- ОС: Plan 9
Re: C и fork();
(elide @ Суббота, 16 Июля 2005, 12:36) писал(а):т.е. ты хочешь, чтоб child process мог менять переменные своего parent'a?
не. afaik, не прокатит такой вариант. (можешь поискать на тему shared sections в ELF - но я ни разу не слышал про такое)
тут надо думать про другие способы IPC.
Да согласен - не подумал
Блог
--------------------
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++
--------------------
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();
2DepeBo: В кодинге я не маста и не гуру, но с этим уже сталкивался...
fork() создает ДОЧЕРНИЙ процесс и копирует всю дату в него, меняется лишь pid и по желанию другие id. Чтобы использовать передачу данных между Дочерними процессами - использование fifo. Если нужно - исходник могу показать.
fork() создает ДОЧЕРНИЙ процесс и копирует всю дату в него, меняется лишь pid и по желанию другие id. Чтобы использовать передачу данных между Дочерними процессами - использование fifo. Если нужно - исходник могу показать.
Best Wishes. LilFox
Won't someone help me find my little Clare.
Won't someone help me find my little Clare.
-
flook
- Сообщения: 585
- Статус: Просто flook
Re: C и fork();
Могу посоветовать еще позвать clone с флажком CLONE_VM (или как-то так).
В каждом из нас спит гений... и с каждым днем все крепче...
-
Alejandro
- Сообщения: 98
- Статус: Наследник "Астарота"
Re: C и fork();
(DepeBo @ Пятница, 15 Июля 2005, 23:20) писал(а):Есть функция и какая-либо переменная. В функции происходит fork. В форкнутом процессе
переменная меняет свое значение. После завершения форка, значение переменной становится
прежним. Как его сохранить?
Стеком пользоваться не пробовал?
Follow the white Rabbit!
-
LilFox
- Сообщения: 137
- Статус: ^^.,
- ОС: Gentoo Linux
Re: C и fork();
Для Alejandro: Стек тут непоможет .
Best Wishes. LilFox
Won't someone help me find my little Clare.
Won't someone help me find my little Clare.
-
Grom
- Сообщения: 260
- ОС: Debian Etch, RHEL-5.4
Re: C и fork();
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));
}
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
Осваиваю: RHEL-5.4
-
DepeBo
- Сообщения: 15
Re: C и fork();
Всем спасибо за ответы 
Воспользовался тредами
Воспользовался тредами
-
Alejandro
- Сообщения: 98
- Статус: Наследник "Астарота"
Re: C и fork();
([MP]DisconNecT @ Среда, 27 Июля 2005, 22:40) писал(а):Для Alejandro: Стек тут непоможет .
Угу. Только я для подобных шуток частенько им пользоваля. А еще специальной областью памяти где и хранил нужные значения переменных
Follow the white Rabbit!
-
LilFox
- Сообщения: 137
- Статус: ^^.,
- ОС: Gentoo Linux
Re: C и fork();
Для Alejandro: ХМ, код в студию, пожалуйста. Да вероятно можно и через стэк, но это может создать некотороые непредвиденные проблемы, или я ошибаюсь???
Пример чтения из пайпа, полная обработка : (взял с учебника по С++ для Unix)
К сожалению коменты не сохранились, так как я сам когда-то делал что-то подобное, все их выпустил - так, что извеняйете если что не так.
Пример чтения из пайпа, полная обработка : (взял с учебника по С++ для 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.
Won't someone help me find my little Clare.
-
d_Sun
- Сообщения: 291
Re: C и fork();
([MP]DisconNecT @ Четверг, 28 Июля 2005, 5:28) писал(а):Пример чтения из пайпа, полная обработка : (взял с учебника по С++ для Unix)
Код: Выделить всё
#include <iostream.h>
#include <stdio.h>Моя подпись сильно длинная :)
-
LilFox
- Сообщения: 137
- Статус: ^^.,
- ОС: Gentoo Linux
Re: C и fork();
d_Sun: Хм, да так и было написано. Главное, что работает и без всякий warnings собирается =). А книжка эта - Системное программирование на C++ для Unix, атор Теренс Чан издательство BHV, Киев, 1997.
Best Wishes. LilFox
Won't someone help me find my little Clare.
Won't someone help me find my little Clare.
-
d_Sun
- Сообщения: 291
Re: C и fork();
([MP]DisconNecT @ Пятница, 29 Июля 2005, 5:24) писал(а):d_Sun: Хм, да так и было написано. Главное, что работает и без всякий warnings собирается =). А книжка эта - Системное программирование на C++ для Unix, атор Теренс Чан издательство BHV, Киев, 1997.
Та компилится то оно будет, но включение этих двух хедеров - маразм
Похоже название книги не соответствует содержимому :devil_2:
Моя подпись сильно длинная :)
-
LilFox
- Сообщения: 137
- Статус: ^^.,
- ОС: Gentoo Linux
Re: C и fork();
Не скажи, эту книгу препод из Беркли писал
, да и год как ты видишь не новый - это только издание 1997, а кого года книга - я не знаю.
А маразмом называется то, программирование на С++, если можно написать ничуть не хуже на С - можешь даже не спорить
) - все равно сам в этом убедишься.
А маразмом называется то, программирование на С++, если можно написать ничуть не хуже на С - можешь даже не спорить
Best Wishes. LilFox
Won't someone help me find my little Clare.
Won't someone help me find my little Clare.
-
d_Sun
- Сообщения: 291
Re: C и fork();
([MP]DisconNecT @ Пятница, 29 Июля 2005, 11:25) писал(а):Не скажи, эту книгу препод из Беркли писал, да и год как ты видишь не новый - это только издание 1997, а кого года книга - я не знаю.
А маразмом называется то, программирование на С++, если можно написать ничуть не хуже на С - можешь даже не спорить) - все равно сам в этом убедишься.
Я уже убедился в обратном :devil_2:
Моя подпись сильно длинная :)