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
Merci, je ne sais pas ce que je pensais. Cela l'a réparé. – Braden