2010-04-23 4 views
1

juste une question rapide concernant C et les processus. Dans mon programme, je crée un autre processus enfant et utilise un canal bidirectionnel pour communiquer entre l'enfant et le parent. L'enfant appelle execl() pour exécuter un autre programme.Travailler avec les processus dans C

Ma question est: Je veux que le parent attende n nombre de secondes et ensuite vérifier si le programme que l'enfant a exécuté a quitté (et avec quel état). Quelque chose comme waitpid() mais si l'enfant ne sort pas en n secondes, j'aimerais faire quelque chose de différent.

Répondre

2

Vous pouvez utiliser waitpid() avec WNOHANG comme option d'interrogation ou enregistrer un gestionnaire de signal pour SIGCHLD.

+0

la route waitpid() semble être le meilleur. est-il un moyen que je peux utiliser waitpid() pour obtenir la valeur de sortie du dernier processus enfant? et je suppose que SIGCHLD exécute le rappel quand un enfant se termine? – Gary

1

Vous pouvez utiliser une alarme pour interrompre waitpid() après N secondes (ne pas utiliser cette approche dans un environnement multithread bien)

signal(SIGALRM,my_dummy_handler); 
    alarm(10); 

    pid_t p = waitpid(...); 
    if(p == -1) { 
    if(errno == EINTR) { 
     //timeout occured 
     } else { 
     //handle other error 
    } 
+0

Cela semble être ce que je suis après :) Seul problème est que si le processus ne se termine pas, le code après waitpid() ne sera jamais exécuté. Comment puis-je réparer cela? – Gary

+0

ou si cela n'a pas de sens, je veux retourner le contrôle de processus au code après waitpid() afin qu'il puisse tuer la fonction fautive – Gary