fablacky
11-02-2013, 08:48
ciao a tutti, avrei un problema che mi tormenta da giorni su c (ambiente linux)
praticamente ho un programma che dovrebbe ricevere in argomento due comandi, com 1 e com2. dunque il programma procede a creare due figli relativi ai due comandi e si mette in pausa. i due processi figli andranno a eseguire i comandi, nello specifico verrā eseguito prima com2, quindi il processo che lo ha eseguito dovrebbe mandare un segnale al processo avente com1 come argomento e quindi fare in modo che quest'ultimo venga eseguito. il problema č che il programma intero si blocca esattamente all'esecuzione di com2 (il primo in ordine cronologico). di seguito il codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
int pid[2];
void exec_fail(int signo);
void exec_succ(int signo);
void figlio(int i, char* com);
void main(int argc, char *argv[]){
int i;
signal(SIGUSR1, &exec_fail);
signal(SIGUSR2, &exec_succ);
printf("%d: creo i figli\n", getpid());
for (i=0; i<2; i++){
pid[i]=fork();
if (pid[i]==0){
printf("%d: creato!\n", getpid());
figlio(i, argv[i+1]);
}
}
printf("%d: creati %d e %d\n", getpid(), pid[0], pid[1]);
pause();
exit(0);
}
void figlio(int i, char* com){
if (i==0){
pause();
printf("%d: sono il processo %d ed eseguo il comando\n", getpid(), i);
execl(com, com, (char*)0);
/*if (execlp(com, com, (char*)0)==-1){
kill(getppid(), SIGUSR1);
exit(-1);
}*/
}
else if (i==1){
printf("%d: sono il processo %d ed eseguo il comando\n", getpid(), i);
execl(com, com, (char*)0);
/*if (execlp(com, com, (char*)0)==-1){
kill(getppid(), SIGUSR1);
exit(-1);
}*/
printf("%d: invio SIGUSR2 a %d\n", getpid(), pid[0]);
kill(pid[0], SIGUSR2);
}
exit(0);
}
void exec_fail(int signo){
printf("esecuzione fallita\n");
}
void exec_succ(int signo){
printf("esecuzione avvenuta con successo\n");
}
qualora non fossi stato sufficientemente chiaro, vi prego di farmelo sapere. grazie :stordita:
praticamente ho un programma che dovrebbe ricevere in argomento due comandi, com 1 e com2. dunque il programma procede a creare due figli relativi ai due comandi e si mette in pausa. i due processi figli andranno a eseguire i comandi, nello specifico verrā eseguito prima com2, quindi il processo che lo ha eseguito dovrebbe mandare un segnale al processo avente com1 come argomento e quindi fare in modo che quest'ultimo venga eseguito. il problema č che il programma intero si blocca esattamente all'esecuzione di com2 (il primo in ordine cronologico). di seguito il codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
int pid[2];
void exec_fail(int signo);
void exec_succ(int signo);
void figlio(int i, char* com);
void main(int argc, char *argv[]){
int i;
signal(SIGUSR1, &exec_fail);
signal(SIGUSR2, &exec_succ);
printf("%d: creo i figli\n", getpid());
for (i=0; i<2; i++){
pid[i]=fork();
if (pid[i]==0){
printf("%d: creato!\n", getpid());
figlio(i, argv[i+1]);
}
}
printf("%d: creati %d e %d\n", getpid(), pid[0], pid[1]);
pause();
exit(0);
}
void figlio(int i, char* com){
if (i==0){
pause();
printf("%d: sono il processo %d ed eseguo il comando\n", getpid(), i);
execl(com, com, (char*)0);
/*if (execlp(com, com, (char*)0)==-1){
kill(getppid(), SIGUSR1);
exit(-1);
}*/
}
else if (i==1){
printf("%d: sono il processo %d ed eseguo il comando\n", getpid(), i);
execl(com, com, (char*)0);
/*if (execlp(com, com, (char*)0)==-1){
kill(getppid(), SIGUSR1);
exit(-1);
}*/
printf("%d: invio SIGUSR2 a %d\n", getpid(), pid[0]);
kill(pid[0], SIGUSR2);
}
exit(0);
}
void exec_fail(int signo){
printf("esecuzione fallita\n");
}
void exec_succ(int signo){
printf("esecuzione avvenuta con successo\n");
}
qualora non fossi stato sufficientemente chiaro, vi prego di farmelo sapere. grazie :stordita: