Donc j'écris un shell UNIX pour une classe de la mienne et en gros je prends un argument, si l'argument a '&' à la fin de celui-ci alors j'ai besoin du processus parent pour invoquer attendez();.J'ai des problèmes avec forking un processus
Mon problème ici est que le programme doit accepter les entrées jusqu'à ce que je tape exit, donc tout est dans une boucle 'while'. Les choses tournent parfaitement jusqu'à ce que j'appelle une commande avec '&' à la fin, et puis je peux voir que le processus parent se termine, puis l'enfant se termine, mais alors je ne suis pas à mon invite normale pour accepter une entrée qui est "osh>".
Donc, fondamentalement, voici ma sortie normale lorsque je lance une commande simple:
osh> ls -l
child:0
a.out main main.cpp main.cpp~
parent: 8695
Mais quand je lance une commande avec le « & » à la fin ce qui se passe:
osh> ls -l &
parent: 27082
osh> child:0
total 44
-rwxr-xr-x 1 myuser users 10368 Mar 1 14:46 a.out
-rwxr-xr-x 1 myuser users 23368 Mar 1 14:00 main
-rw-r--r-- 1 myuser users 1658 Mar 1 14:46 main.cpp
-rw-r--r-- 1 myuser users 1676 Mar 1 14:45 main.cpp~
<cursor is here accepting commands, but no osh> prompt>
Si quelqu'un a des commentaires ou des suggestions, serait apprécié. J'ai l'impression que c'est juste un petit bogue, mais j'ai traversé un débogueur plusieurs fois et je ne trouve rien. Je n'ai tout simplement pas beaucoup d'expérience à faire des choses. Voici le code complet à regarder:
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <string>
#include <cstring>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
#define MAX_LINE 80 //the maximum length command
using namespace std;
int main()
{
char* args[MAX_LINE/2 + 1]; //command line arguments
char str[41]; //intitialize string for input
int should_run = 1; //flag to determine when to exit program
bool status; //status of whether or not an ampersand is in the passed argument
while (should_run) {
int index = 0;
cout << "osh> ";
fflush(stdout);
cin.getline(str, 41);
args[index] = strtok(str, " ");
while (args[index] != NULL) {
index++;
args[index] = strtok(NULL, " ");
}
if (strcmp (args[0], "exit") == 0) //in input is "exit", exit the while loop
break;
if (*args[index - 1] == '&') //check whether to run processes concurrently
status = true;
args[index - 1] = NULL; //remove & to make sure arguments are valid
// (1) fork a child process using fork()
pid_t pid = fork();
if (pid < 0) { //error handling
perror("Fork Failed.");
break;
}
// (2) the child process will invoke execvp()
if (pid == 0) {
//child process
cout << "child:" << pid << endl;
if (execvp (args[0], args) == -1) {
perror ("exec");
}
}
// (3) if command didn't included &, parent will invoke wait()
//parent process
if (pid > 0) {
// parent process
if (!status) {
wait(0);
}
cout << "parent: " << pid << endl;
}
}
return 0;
}
Edit: Aussi juste réalisé que ma deuxième sortie I posté, il montre « osh> » une deuxième fois après le processus parent, ne sais pas comment décrire cette erreur.
C'est à peu près comme cela fonctionne dans tous les autres shell Unix. – immibis
Une raison de ne pas écrire cela en C, ce qui est presque tout? –
@NeilButterworth Juste plus à l'aise avec C++ – HOAX