Partage
  • Partager sur Facebook
  • Partager sur Twitter

Job control en C

    13 février 2018 à 21:42:01

    Bonjour à tous, 

    J'essaye de faire un job control en C, pour un projet scolaire.

    void        do_exec(const char *path, char *const argv[], char *const envp[])
    {
        pid_t   child;
    
        child = fork();
        if (child == -1) {
            printf("error: forking failed\n");
            exit(1);
        }
        /* Процесса потомка */
        if (child == 0) {
            execve(path, argv, envp);
        }
        /* Процесса родителя - ждем */
        if (child > 0) {
            wait(NULL);
        }
    }

    Dans ma fonction actuelle, j'ai un fork et un exec pour le processus fils, et un wait qui attend que le fils se termine pour continuer le processus parent.

    Admettons que je veuille implémenter un job control, mon fork et exec créent mon processus fils, et je stoppe celui-ci (sans le kill) avec un Ctrl-Z. 

    Je pense que le processus parent ne peux pas wait, sinon il ne pourrait pas catcher le signal Ctrl-Z, et le processus fils n'est pas obligé de catcher celui-ci (un while(1) dans un simple test.c peut être stopped et resumed avec Ctrl-Z et fg, donc c'est bien le parent qui catch Ctrl-Z)

    Donc comment implémenter cela ? Je dois remplacer wait par quelque chose qui me permet de continuer à avoir le process parent, mais rendre le tty sur le processus fils, et si je stoppe celui-ci, rendre le tty au processus parent.

    Merci d'avance !!!

    • Partager sur Facebook
    • Partager sur Twitter
      14 février 2018 à 9:49:38

      Tu n'as le droit qu'a wait ? Je pense notamment a waitpid qui prend en parametre les options suivantes :

      WNOHANG
      revenir immédiatement si aucun fils n'est achevé.
      WUNTRACED
      revenir si un fils est bloqué (mais non suivi par ptrace(2)). L'état des fils suivis est fourni même sans cette option. traced
      WCONTINUED (Depuis Linux 2.6.10)
      revenir si un fils bloqué a été relancé par la délivrance du signal SIGCONT.

      http://manpagesfr.free.fr/man/man2/wait.2.html

      • Partager sur Facebook
      • Partager sur Twitter
        14 février 2018 à 19:02:49

        Pouet_forever a écrit:

        Tu n'as le droit qu'a wait ? Je pense notamment a waitpid qui prend en parametre les options suivantes :

        WNOHANG
        revenir immédiatement si aucun fils n'est achevé.
        WUNTRACED
        revenir si un fils est bloqué (mais non suivi par ptrace(2)). L'état des fils suivis est fourni même sans cette option. traced
        WCONTINUED (Depuis Linux 2.6.10)
        revenir si un fils bloqué a été relancé par la délivrance du signal SIGCONT.

        http://manpagesfr.free.fr/man/man2/wait.2.html

        Tout ce qui n'est pas explicitement spécifié comme autorisé est implicitement interdit. Je pense que je n'ai le droit qu'a wait.

        Mais ce n'est pas possible de le faire avec wait seulement ? J'ai l'impression que les shells classiques type ZSH ou BASH n'attendent pas que le processus fils se termine mais continuent en bloquant les sorties standards. De sorte qu'ils peuvent encore catcher les signaux et donc stopper/continuer/killer des processus.



        • Partager sur Facebook
        • Partager sur Twitter
          15 février 2018 à 8:34:01

          Je vois pas trop, mais peut-etre qu'il existe un autre moyen. Mais bon, il y a un moment ou tu es oblige de voir ou en est ton processus pour checker son etat et a part wait* je vois pas trop. :)
          • Partager sur Facebook
          • Partager sur Twitter
            16 février 2018 à 1:22:49

            Pouet_forever a écrit:

            Je vois pas trop, mais peut-etre qu'il existe un autre moyen. Mais bon, il y a un moment ou tu es oblige de voir ou en est ton processus pour checker son etat et a part wait* je vois pas trop. :)


            void		int_handler(int a)
            {
            	printf("signal %d (SIGINT) was catched\n", a);
            }
            
            int			main(void)
            {
            	struct sigaction	sigint;
            	pid_t				child;
            
            	sigint.sa_handler = int_handler;
            	sigint.sa_flags = SA_NOCLDSTOP;
            	child = fork();
            	if (child == -1) {
            		printf("error: fork failed\n");
            		exit(1);
            	}
            	if (child == 0) {
            		printf("child process started\n");
            	}
            	if (child > 0) {
            		sigaction(SIGINT, &sigint, NULL);
            		wait(NULL);
            		printf("child process has terminated\n");
            	}
            	return (0);
            }
            J'arrive à catcher un SIGINT (Ctrl-C) avec ce code. Même quand mon prog wait, il continue de pouvoir catcher des signaux.

            • Partager sur Facebook
            • Partager sur Twitter
              16 février 2018 à 8:39:27

              Mais ça ne change pas le fait d'avoir un wait ! Il va toujours bloquer le programme ! ;)
              • Partager sur Facebook
              • Partager sur Twitter
                16 février 2018 à 15:28:03

                Pouet_forever a écrit:

                Mais ça ne change pas le fait d'avoir un wait ! Il va toujours bloquer le programme ! ;)


                Ou alors ne pas mettre de wait, et bloquer l'output/input...

                Je vois pas ce que waitpid apporte en fait, ce manuel est imbuvable, je ne pige rien.

                • Partager sur Facebook
                • Partager sur Twitter

                Job control en C

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown