Le Shell que j'écris doit exécuter un programme qui lui est donné par l'utilisateur. Voici la version simplifiée très abrégée de mon programme
int main()
{
pid_t pid = getpid(); // this is the parents pid
char *user_input = NULL;
size_t line_sz = 0;
ssize_t line_ct = 0;
line_ct = getline(&user_input, &line_sz, stdin); //so get user input, store in user_input
for (;;)
{
pid_t child_pid = fork(); //fork a duplicate process
pid_t child_ppid = getppid(); //get the child's parent pid
if (child_ppid == pid) //if the current process is a child of the main process
{
exec(); //here I need to execute whatever program was given to user_input
exit(1); //making sure to avoid fork bomb
}
wait(); //so if it's the parent process we need to wait for the child process to finish, right?
}
}
Supposons que l'utilisateur puisse entrer quelque chose comme ls, ps, pwd
Merci.
Modifier:
const char* hold = strdup(input_line);
char* argv[2];
argv[0] = input_line;
argv[1] = NULL;
char* envp[1];
envp[0] = NULL;
execve(hold, argv, envp);
Voici une solution simple et lisible:
pid_t parent = getpid();
pid_t pid = fork();
if (pid == -1)
{
// error, failed to fork()
}
else if (pid > 0)
{
int status;
waitpid(pid, &status, 0);
}
else
{
// we are the child
execve(...);
_exit(EXIT_FAILURE); // exec never returns
}
L'enfant peut utiliser la valeur stockée parent
s'il a besoin de connaître le PID du parent (bien que je ne le fasse pas dans cet exemple). Le parent attend simplement que l'enfant ait fini. En effet, l'enfant s'exécute "de manière synchrone" à l'intérieur du parent, et il n'y a pas de parallélisme. Le parent peut interroger status
pour voir de quelle manière l'enfant est sorti (avec succès, sans succès ou avec un signal).