Hello!
Egy sima c progiban indítok egy másikat a system() függvénnyel.
Ezután szükség lenne arra, hogy figyelje ugyanez a progi az indított progit, főleg azt, hogy fut e még. Mint a bash-ban a
test -x vmi -vel.
Van egyáltalán ilyen?
Fontos, hogy mindenképpen c programban, tehát script (és a fenti megoldás) nem jó.
nagyonthx
- 2299 megtekintés
Hozzászólások
igen van ilyen lehetoseg de processek inditasara a fork-exec et ajanlanam. Tessek 1 link hozza
http://yolinux.com/TUTORIALS/ForkExecProcesses.html
- A hozzászóláshoz be kell jelentkezni
Kössz, megnézem.
--gydanee
- A hozzászóláshoz be kell jelentkezni
A system() megvárja a gyerek processzt, csak akkor tér vissza, amikor az már kilépett.
- A hozzászóláshoz be kell jelentkezni
Ezzel egy baj van: az indított program forkolhat. Pl. system() -nek megadod, hogy az "amavisd reload"-ot futtassa. Ekkor az amavisd a háttérbe megy egy idő után, az eredeti process pedig végetér.
- A hozzászóláshoz be kell jelentkezni
nem a systemet hasznald az execet azzal indithatsz barmit es vard eg mig a pidje ervenyet veszti maga a system hivas nem tul alkalmas processek rugalmas kezelesere nezd meg a tutorial abban van 1 pl ahol az ls hivjak es varjak mig visszter.
- A hozzászóláshoz be kell jelentkezni
Lényeges különbség a system() és az exec() (és rokonai) között, hogy a system() egy új shell-t nyit, és abban futtatja a megadott programot, míg az exec() által hívott program az aktuális processz __helyére__ lép, azaz nem tudsz egy exec() után visszatérni! Ezért először egy fork()-kal kell még egy példányt létrehozni az aktuálisan futó processzedből, - ennek a pid-jét eltárolod - majd exec()-el meghívod a másik programot, amely már a fork-olt childprocessz helyére lép. Ezt a módszert ajánlja a glibc manual is:
http://www.gnu.org/software/libc/manual/html_node/Process-Creation-Exam…
#include
#include
#include
#include
#include
/* Execute the command using this shell program. */
#define SHELL "/bin/sh"
int
my_system (const char *command)
{
int status;
pid_t pid;
pid = fork ();
if (pid == 0)
{
/* This is the child process. Execute the shell command. */
execl (SHELL, SHELL, "-c", command, NULL);
_exit (EXIT_FAILURE);
}
else if (pid < 0)
/* The fork failed. Report failure. */
status = -1;
else
/* This is the parent process. Wait for the child to complete. */
if (waitpid (pid, &status, 0) != pid)
status = -1;
return status;
}
Meg kell jegyezni továbbá, hogy az amavisd jellegű programokat (ami egy perl script tkp.), érdemesebb system-el hívni, mivel úgy megkapja a teljes környezetet, ami a shell-ben alapból megvan, és erre az ilyen progiknak általában szüksége is van, mert nem futnak előre beállított környezeti változók nélkül. A fenti példa viszont erre is jó, tehát ha totális kontrollt szeretnél egy processz felett, és környezeti változók is kellenek, így ajánlatos csinálni.
- Üdv: Kajla
u.ui: Remélem, nem írtam semmi baromságot...
- A hozzászóláshoz be kell jelentkezni
Megnézegettem és ezek tök jó, köszi...
Ám nekem nem a fork-kal készített processz-nek kellene, hogy megvárja, meg ilyesmi...
hanem abból a programból akarom megnézni, hogy fut e, amiből fork-oltam...
A fork-lt gyerekének pid-jét (azaz magának az indított progi pid-jét) át tudtam adni az eredeti proc-nek, de nem tudok hozzáférni egy lekérdezés erejéig...???
--gydanee
- A hozzászóláshoz be kell jelentkezni
Sufnigány(c)
megnézem, hogy a pid-hez tartozó /proc/.pid./ könyvtárban meg tudok e nyitni egy file-t. PL. cmdline
lol
--gydanee
- A hozzászóláshoz be kell jelentkezni
man 2 pipe
- A hozzászóláshoz be kell jelentkezni
Ezt pl. hogyan szokás használni?
És ha 0-as SIGNAL-t küld a pid segítségével...? vagy azt c -vel nem lehet, csak scripttel?
thx
--gydanee
- A hozzászóláshoz be kell jelentkezni
No pláne, hogy a 'test -x vmi' azt nézi, hogy a 'vmi' futtatható-e, nem pedig azt, hogy fut-e.
- A hozzászóláshoz be kell jelentkezni
alapvetoen 3 fele utad van a processek kezelésére
1 oszttt memorian keresztul
foglal 1 memoriat amihez mint 2 process hozza fer igy aba cserelhetnek adatokat
2 signalokon keresztul
vannak definalt signalok es vanna nem definalt signalok a deffinalt signalokat a op kezeli le.
3 msg kresztul mindenfele uzeteteket kuldogethetsz nekik ezt a op segiti elo
de van 1 fontos dolog ugy hivjak mutexeles arrol van szo hogy ha shered memoriat hasznalsz a adatokatra vigyazni kell hogy egyszere ne irja az egyik process mig a masik olvassa bar ez 1 processoros rendszerben nehezen elkebzelheto.
ezeket a mutexelésselsemaforokall oldjak meg sok a szakirodalom ez ugyben keressel ra ezekre a neten.
van 1 csavo valami Vadasz Dénes aki ezt ossze is ollozta neked. Es kiadta sajat jegyzetnek a miskolci egyetemen.
- A hozzászóláshoz be kell jelentkezni