c progiból futó program keresése

Fórumok

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

Hozzászólások

A system() megvárja a gyerek processzt, csak akkor tér vissza, amikor az már kilépett.

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...

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

No pláne, hogy a 'test -x vmi' azt nézi, hogy a 'vmi' futtatható-e, nem pedig azt, hogy fut-e.

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.