|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
[c] iexeclp
salve ragazzi ho il seguente problema faccio una kiamata da client c alla funzione
if ((execlp("python","Main.py",(char*)0))) per eseguire un file python. Solo che alla chiamata mi appare la shell di python come se il secondo parametro passato Main.py non esistesse qualcuno ha qualke idea? Codice:
else if (pid == 0)// Processo figlio da modificare quando ci sono + elaborazioni da fare { sleep(3); if ((execlp("python","Main. py",(char*)0))) //if ((execlp("streamer","-c","/dev/video0","-o","elab.jpeg",(char*)0))) { printf("errore execlp\n"); } elaborazione=1; exit(0); } //else //processo padre attende il figlio //{ printf("aspetto ke finisca il figlio\n"); while (wait(&status) != pid) printf("mio figlio ha finito\n"); elaborazione=1; |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quindi: if ((execlp("python","python","Main.py",(char*)0)))
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
Quote:
Python 2.4.3 (#2, Oct 6 2006, 07:52:30) [GCC 4.0.3 (Ubuntu 4.0.3-1ubuntu5)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Dovrebbe essere come ho detto io.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
Ho provato ad aggiungere #!/usr/bin/env python sul programma Main.py poi ho fato i permessi di esecuzione al file chmod +x main.py ed infine ho aggiunto nel codice if ((execlp("./Main.py",(char*)0))) ma niente mi pare sempre la schermata di shell eppure io non chiamo affatto python... Non è che la funzione exec vuole qualke altro parametro? |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
#include <unistd.h> int main (void) { execlp ("python", "python", "prova.py", (char*)0); return 0; } Codice:
print "hello world"
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
Quote:
|
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Hai provato a lanciare il comando a mano python Main.py? Cosa succede?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Puoi provare a lanciare python come ho fatto io nell'esempietto "C"?? Giusto per curiosità, per capire se è proprio la execlp che è "fusa".
![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
|
![]() |
![]() |
![]() |
#12 | |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
Quote:
Codice:
if (elaborazione==0) { if ((pid=fork() ) < 0) { printf("Errore di fork\n"); } else if (pid == 0)// Processo figlio da modificare quando ci sono + elaborazioni da fare { //sleep(3); if (execlp ("python", "python", "Main.py", (char*)0)) //if ((execlp("streamer","-c","/dev/video0","-o","elab.jpeg",(char*)0))) { printf("errore execlp\n"); } elaborazione=1; exit(0); } else //processo padre attende il figlio { printf("aspetto ke finisca il figlio\n"); while (wait(&status) != pid) printf("mio figlio ha finito\n"); elaborazione=1; } Grazie |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
P.S.: nota che fare elaborazione=1 nel figlio non serve, visto che modifica solo la sua "copia" della variabile 'elaborazione'.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#14 | |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
Quote:
![]() Quindi dovrei mettere nell'else del padre solo wait(pid) giusto? Tnx so much |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Puoi testare eventualmente se wait ritorna -1 in caso di errore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
|
![]() |
![]() |
![]() |
#17 | |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
Quote:
Mi spiego, sto creando un processo che come già hai visto mi manda in esecuzione tramite exec un programma in python. Da questo faccio un'elaborazione di una immagine e salvo i risultati in un file (unico modo che mi è venuto in mente per far condividere informazioni tra c e python). Successivamente faccio fare dal processo padre, una volta che il figlio ha teminato, un controllo sui risultati. Il problema sta proprio quì, nel senso, che io non vorrei far terminare il figlio ma solo metterlo in attesa, poichè dopo che il padre termina la sua elaborazione dovrà fare un'altra chiamata exec a python per elaborare un'altra immagine sprecando tempo e risorse. Mentre se il figlio si fosse messo in attesa la seconda chiamata ad exec poteva essere evitata! Hai qualche idea? ti metto per semplicità il codice riassunto per fare eventuali prove Codice:
#include <unistd.h> #include <signal.h> #include <sys/types.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> //------------------------------------Variabili per il file-------------------- #define kFileDaLeggere "prova.txt" //#define kFileDaScrivere "output.txt" #define kLunghezzaMaxStringa 100 double numero1; char *stringa; //---------------------------------------Fine variabili file-------------------- FILE *ingresso; int status; pid_t pid; int main (void) { if ((pid=fork() ) < 0) { printf("Errore di fork\n"); } else if (pid == 0)//Processo figlio { sleep(3); if (execlp ("python", "python", "Main.py", (char*)0)) { printf("errore execlp\n"); } //elaborazione=1;//qui nn ha senso perkè va a modificare solo la sua copia exit(0); } else//processo padre attende il figlio { printf("aspetto ke finisca il figlio\n"); //while (wait(&status) != pid) wait(&status); printf("mio figlio ha finito\n"); printf("Lettura dal file %s\n",kFileDaLeggere); ingresso=fopen(kFileDaLeggere,"r"); if(ingresso==NULL) printf("Errore di I/O\n"); stringa=calloc(kLunghezzaMaxStringa,sizeof(char)); if(stringa==NULL) printf("Errore di memoria\n"); fscanf(ingresso,"%s %lg",stringa,&numero1); printf("Classe: %s\nValore Massimo: %g\n",stringa,numero1); printf("\n"); fclose(ingresso); if (numero1>90) { printf("il valore è accettabile\n"); } else { printf("il valore è troppo piccolo\n") ; } return 0; } } |
|
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quando nel processo figlio esegui una delle funzioni exec(), l'immagine del processo corrente viene totalmente rimpiazzata dal nuovo processo caricato. Quindi se esegui 'python', del tuo programma C non resta nulla, c'è solo più l'immagine del nuovo processo. Quindi una volta che hai lanciato python, il processo è interamente sotto il suo controllo. Dal processo padre puoi aspettare la terminazione del figlio ma potresti anche comunicare con il figlio in vari modi (es. con le pipe) ma sono argomenti abbastanza complessi. Se il tuo interesse è quello di sfruttare le potenzialità di python, c'è una possibilità interessante offerta da python stesso: incorporare python nella tua applicazione. Infatti python è un linguaggio "extendable" (estendibile) e "embeddable" (incorporabile). Invece di eseguire l'interprete python come processo (figlio) separato, puoi inglobare l'interprete python nella tua applicazione. Potrai quindi impostare variabili, eseguire script, ecc... in modo diretto. Se ti interessa questa soluzione, leggi <questo> documento. Purtroppo non so dirti di più perché di python ne so poco. Non credo che sia difficile incorporare python. In passato ho avuto la necessità di incorporare in una applicazione C l'interprete del linguaggio TCL e ti assicuro che non è stato difficile.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#19 | |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
Quote:
Ti ringrazio mi leggo quel documento che mi hai dato e ti faccio sapere, ti dico solo che il mio programma in python a sua volta chioama altri 4 file sempre in python nn so se questo è un problema cmq mi leggo quel doc e poi ti faccio sapere grazie |
|
![]() |
![]() |
![]() |
#20 | |
Member
Iscritto dal: Aug 2003
Messaggi: 202
|
Quote:
Oggi in laboratorio ho incontrato un nuovo problema che ho risolto in un modo che tra un pò ti vado a spiegare. Prima però volevo sapere se invece di utilizzare una fork utilizzassi una vfork lo sapzio d'indirizzamente tra padre e figlio sarebbe lo stesso? Il problema è il seguente: Utilizzo un programma che si interfaccia con un robot, "player", il quale utilizza il device dev/video0 per acquisire immagini dalla camera. Avedo utilizzato una fork per avviare un nuovo processo (in python) che a sua volta fa uso del device dev/video0 tramite la libreria pyv4l per elaborare porzioni di immagini avviene un errore nella chiamata in quanto il device dev/video0 è già occupato da player. la soluzione che ho adottato è quella di annullare l'iscrizione del dispositivo subito prima di chiamare la fork exec e successivamente sottoscriverlo. Visto che mi sembra una soluzione un pò macchinosa non potrei utilizzare la vfork per condividere le risorse tra padre e figlio? Grazie |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:33.