Newsgroup: it.comp.lang.c
Titolo: file h: process.h ( spawn*)


Oggetto: file h: process.h  ( spawn*)
Data: venerdě 26 gennaio 2001 11.14
Sono uno studente, ho trovato questa funzione e sembra fare al caso mio, ma
dalle textinfo di rhide (l'interfaccia che uso) non riesco a cavarne
molto...
Libri che ho a casa o sottomano (solamente manuali didattici) non mi hanno
aiutato molto.
il mio scopo (sempre che sia fattibile in modo semplice)e quello di lanciare
un programma da un'altro e poi magari tornare al primo (mi semplificherebbe
la vita, e non di poco). N.B. niente memoria condivisa o cose del genere!!!
dove posso trovare info al riguardo, per sapere anche a grandi linee cosa
succede? Se invece qlc si sente in tardivo spirito natalizio e mi vuol dare
1 o 2 "lezioni" č benvenuto!!! garantisco un grazie di cuore.

 1 o 2 "lezioni" è benvenuto!!! garantisco un grazie di cuore.
system()
La funzione system() costituisce forse il mezzo più semplice per raggiungere
lo scopo: essa deve infatti essere invocata passandole come unico parametro
una stringa contenente, né più né meno, il comando che si intende eseguire.
Ad esempio, il codice:
#include <stdlib.h>
#include <stdio.h> // per fprintf()
#include <errno.h> // per errno
...
    if(system("comando param1 param2") == -1)
        fprintf(stderr,"errore %d in system()\n", errno);
lancia il programma comando passandogli i parametri param1 e param2. Dal
momento che, nell'esempio, per comando non è specificato un path, il sistema
utilizza la variabile di environment PATH [1] (non è necessario specificare
l'estensione). Dall'esempio si intuisce che system() restituisce -1 in caso
di errore; tuttavia va sottolineato che la restituzione di 0 non implica che
comando sia stato effettivamente eseguito secondo le intenzioni del
programmatore. Infatti system() esegue il comando ricevuto come parametro
attraverso l'interprete dei comandi: in altre parole, essa non fa altro che
lanciare una copia dell'interprete stesso e scaricargli il barile, proprio
come se fosse stata digitata la riga
command -c "comando param1 param2"
Ne segue che system() si limita a restituire 0 nel caso in cui sia riuscita
a lanciare correttamente l'interprete, e non si preoccupa di come questo se
la cavi poi con il comando specificato: pertanto, non solo non è possibile
conoscere il valore restituito al sistema dal child, ma non è neppure
possibile sapere se questo sia stato effettivamente eseguito.
Se, da una parte, ciò appare come un pesante limite, dall'altra la system()
consente di gestire anche comandi interni DOS, proprio perché in realtà è
l'interprete a farsene carico. Ad esempio è possibile richiedere
    system("dir /p");
e system() restituisce -1 solo se non è stato possibile lanciare
l'interprete dei comandi. Inoltre, è possibile eseguire i file batch.
Ancora,
    system("command");
esegue un'istanza dell'interprete, mettendo il prompt del DOS a disposizione
dell'utilizzatore: digitando
exit
al prompt la shell viene chiusa e l'elaborazione del programma parent
riprende [2].
Infine, system() può essere utilizzata semplicemente per verificare se
l'interprete dei comandi è disponibile:
    system(NULL);
restituisce un valore diverso da 0 se è possibile lanciare l'interprete dei
comandi.
E' superfluo (speriamo!) chiarire che l'argomento di system() non deve
necessariamente essere una costante stringa, come si è assunto per comodità
negli esempi precedenti, ma è sufficiente che esso sia di tipo char *: ciò
consente la costruzione dinamica della riga di comando, ad esempio mediante
l'utilizzo di funzioni atte ad operare sulle stringhe [3] (strcpy(),
strcat(), sprintf(), etc.).
spawn...()
Come la system(), anche le funzioni della famiglia spawn...() consentono di
lanciare programmi esterni come se fossero subroutine del parent; tuttavia
esse non fanno ricorso all'interprete dei comandi, in quanto si basano sul
servizio 4Bh dell'int 21h [4]: di conseguenza, non è possibile utilizzarle
per invocare comandi interni DOS né file batch, tuttavia si ha un controllo
più ravvicinato sull'esito dell'operazione. Esse infatti restituiscono -1 se
l'esecuzione del child non è riuscita; in caso contrario restituiscono il
valore che il programma child ha restituito a sua volta.
Tutte le funzioni spawn...() richiedono come primo parametro un intero, di
solito dichiarato nei prototipi con il nome mode, che indica la modalità di
esecuzione del programma child: in PROCESS.H sono definite le costanti
manifeste P_WAIT (il child è eseguito come una subroutine) e P_OVERLAY (il
child è eseguito sostituendo in memoria il parent, proprio come se fosse
chiamata la corrispondente funzione della famiglia exec...()). Come
osservato riguardo system() (vedere oltre), anche le funzioni spawn...() non
possono essere utilizzate per lanciare shell permanenti o programmi TSR;
tuttavia l'utilizzo del valore P_OVERLAY per il parametro mode consente
un'eccezione, in quanto il parent scompare senza lasciare traccia di sé e,
in uscita dal child, la sua esecuzione non può mai riprendere.
Il secondo parametro, di tipo char *, è invece il nome del programma da
eseguire: esso, diversamente da quanto visto circa la system(), deve essere
completo di estensione; inoltre, se non è specificato il path, solo le
funzioni spawnlp(), spawnlpe(), spawnvp() e spawnvpe() utilizzano la
variabile di environment PATH (la lettera "p" presente nel suffisso finale
dei nomi delle funzioni indica proprio detta caratteristica).
tratto da un manuale in formato html di C
Ciao
Omar


Sotto che sistema opeartivo intendi fare ciò?

GRAZIE!!!