2010-10-01 17 views
2

Ce que je suis en train de mettre en œuvre est une version (plus simple) de bash. L'une des tâches est d'accepter la commande:Redirection de la sortie du processus forké vers le processus parent en C

$ bg <command> <arguments> 

Ce sera alors la fourche d'un nouveau processus, puis exécutez execvp() dans le nouveau processus en utilisant <command> et <arguments> en tant que paramètres. Le problème est que lorsque je capture la sortie du processus enfant, j'utilise pipe(), et après avoir obtenu la sortie du processus fils et l'avoir sortie quand je veux, je ne peux pas sembler revenir à STDIN pour mon parent (shell) processus, ce qui entraîne une erreur de segment la prochaine fois que j'ai besoin d'accepter les entrées.

Voici une partie de ma fonction "bg".

ChildPID = fork(); 
if (ChildPID < 0) { 
/* There is an error */ 
printf("Error forking the process.\n"); 
exit(1); 
} 
if (ChildPID >= 0) { 
if (ChildPID == 0) { /* Child Process */ 
    close(m_pipefd[0]); 
    dup2(m_pipefd[1], STDOUT_FILENO); 
    close(m_pipefd[1]); 
    //sleep(5); 
     err = execvp(optionsPTR[0], optionsPTR); 
    switch (errno) { 
    case ENOENT: 
    printf("RSI: %s: command not found\n", optionsPTR[0]); 
    break; 
    case EACCES: 
    printf("RSI: %s: Permission denied\n", optionsPTR[0]); 
    break; 
    } 
    exit(1); 
} 
else { /* Parent Process */ 
    WaitErr = waitpid(ChildPID, &status, WNOHANG | WUNTRACED); 
       return(0); /* to main */ 
     } 
} 
return 0; 

Et le code pour quand je reçois la sortie du tuyau après la fin du processus.

close(m_pipefd[1]);  
dup2(m_pipefd[0], STDIN_FILENO); 
while(fgets(buffer, sizeof(buffer), stdin)) { 
buf = buffer; 
printf("%s\n", buf); 
} 
close(m_pipefd[0]); 

Ainsi, la tl; dr version est que je dois revenir à réinitialiser stdin pour le processus parent après avoir capturé l'enfant traite la sortie.

Merci,

Braden

Répondre

3

Il n'y a généralement pas besoin de salir avec stdin et stdout dans votre parent. Une fois que vous avez connecté vos tuyaux dans l'enfant à stdin et stdout, les autres extrémités des tuyaux doivent être en mesure d'envoyer des données ou d'obtenir des données de l'enfant.

Lisez simplement m_pipefd [1] dans votre parent.

+0

Merci, je ne sais pas ce que je pensais. Cela l'a réparé. – Braden