web-dev-qa-db-fra.com

comment utiliser correctement fork, exec, wait

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?

    }
}
  1. Ai-je bifurqué le nouveau processus et vérifié si c'est un processus enfant correctement
  2. Quel exec pourrais-je utiliser ici pour ce que j'essaye de faire? Quel est le moyen le plus simple
  3. Quels sont mes arguments pour attendre? la documentation que je regarde n'aide pas beaucoup

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);
22
Collin

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).

49
Kerrek SB