Portál AbcLinuxu, 8. června 2025 18:37


Dotaz: exec() bez fork()

13.12.2005 21:25 johny amater
exec() bez fork()
Přečteno: 132×
Odpovědět | Admin
Zdravim je korektni preplacnout proces volanim exec nebo by se to melo udelat v synovskem procesu a na ten pockat?

tedy

bud
...
exec(..)
nebo
..
switch (pid = fork()) {
 case -1:
 case 0:
  exec(..);
 default:
  waitpid(pid, &status, 0);
  return WEXITSTATUS(status);
}
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.12.2005 21:28 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: exec() bez fork()
Odpovědět | | Sbalit | Link | Blokovat | Admin
Záleží na tom, jestli chcete zplodit potomka nebo nahradit proces kompletně novým programem.
Luboš Doležel (Doli) avatar 13.12.2005 21:29 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: exec() bez fork()
Odpovědět | | Sbalit | Link | Blokovat | Admin
Můžete replacnout, pokud už nemáte v plánu v tom procesu nic jiného dělat.
13.12.2005 21:34 johny amater
Rozbalit Rozbalit vše Re: exec() bez fork()
Samozřejmě nic dalšího se v procesu dělat nemá. Tedy to nemůže za žádných okolností způsobit žádné problémy (nevím jaké, ptám se)? Je to tedy způsob, jakým se to bežně dělá?
13.12.2005 21:41 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: exec() bez fork()
Tedy to nemůže za žádných okolností způsobit žádné problémy (nevím jaké, ptám se)?

Kdyby to mělo způsobit nějaké problémy, způsobí je to nejspíš i v tom potomkovi (což je téměř identický proces). Naopak, má to své výhody, např. že image původního procesu nebude celou dobu zbytečně zaclánět v paměti.

Je to tedy způsob, jakým se to bežně dělá?

Ano, např. pokud mne paměť neklame, při přihlašlování uživatele takto getty spouští login a login takto spouští shell.

13.12.2005 21:58 johny amater
Rozbalit Rozbalit vše Re: exec() bez fork()
Hmm. Ale neni to z jisteho uhlu pohledu podobne jako vyvolani _exit()?

U poznamek _exitu se pravi treba:

The function _exit is like exit(), but does not call any functions registered with the ANSI C atexit function, nor any registered signal handlers. Whether it flushes standard I/O buffers and removes temporary files created with tmpfile(3) is implementation-dependent.

Nic z toho nepouzivam, ale nemuze tam byt nejaka jina podobna zrada?
13.12.2005 23:03 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: exec() bez fork()
To je samozřejmě na vás, abyste před voláním exec() uklidil, co potřebujete. Předpokládám, že tu funkci voláte z vlastního popudu, ne jako reakci na nějakou neočekávanou událost, takže na to máte dost klidu.
14.12.2005 20:35 petr_p
Rozbalit Rozbalit vše Re: exec() bez fork()
Napr. descriptory bez nastaveneho FD_CLOEXEC zustanou otevreny i po execu.
15.12.2005 00:14 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: exec() bez fork()
S tím se ovšem tak nějak počítá jako s vlastností. Jinak by vám nefungovalo ani obyčejné přesměrování nebo roura v shellu.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.