Forum Linux.debian/ubuntu process, pid et fonction fork()

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
19
sept.
2020

bonjour,
je découvre la gestion des process et l'identification par les pid sous linux
je cherche à comprendre comment ca fonctionne:
si j'ai un terminal ouvert (avec un pid correspondant au process) et que je lance
nano, je vais avoir deux pid quand jen fais la liste avec ps aux :
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user pid1 bash
user pid2 nano

si j'ai un script shell ou python cgi dans lequel j'ai la fonction fork() et que je l'execute,
en principe, je devrais avoir deux pid distincts une fois la ligne fork exécutée non?

ensuite sur le coté "pratique", je pensais que faire appel à une fonction fork dans un script permettait par exemple sur un serveur controllé à distance de pas occuper le terminal avec un process de facon à ne pas occuper la ligne de commande. Mais visiblement ca ne fonctionne pas comme ca..
quand je teste dans mon script ca cree effectivement un pid distinct de mon bash (exactement comme quand je lance nano depuis ma ligne de commande) mais rien de plus.
Donc ma question : quel sont les interets pratique et theorique de la fonction fork et d'avoir des parent/master process et des slave/children process?
Idem pr un fork dans un fork (process enfant d'enfant)

  • # fork ?

    Posté par  . Évalué à 2.

    De quel fork parles-tu ?

    # man -k fork
    fork (2)             - create a child process
    forkpty (3)          - terminal utility functions
    vfork (2)            - create a child process and block parent
    vfs_aio_fork (8)     - implement async I/O in Samba vfs
    

    De base, fork() s'utilise en C. La fonction clone le process courant, et retourne le PID du fils au père, et 0 au fils.

    Tu parles de scripts ? Peut-être du & à la fin d'une commande ? Si c'est ça, ton problème pourrait provenir de l'emplacement de ce &, des guillemets ou quote manquant (" et ')

    Donne un contexte un peu plus précis, ou des exemples.

    • [^] # Re: fork ?

      Posté par  (site web personnel) . Évalué à 2.

      Il me semble que le simple fait d'utiliser | provoque un fork.

      De même que l'utilisation de l'instruction coproc, ou des ( ) (y compris avec $( ), pour les plus anciens ``).

      • [^] # Re: fork ?

        Posté par  . Évalué à 1.

        Tout à fait :

        $ a | b
        

        provoque la création de deux process, un pour a, un pour b, et l'utilisation de

        int pipe(int pipefd[2]);
        

        pour établir le lien entre la sortie de a et l'entrée de b.

  • # fork

    Posté par  (site web personnel) . Évalué à 2.

    Donc ma question : quel sont les interets pratique et theorique de la fonction fork

    Beh c'est un peu la façon sous unix d'engendrer un process.

    et d'avoir des parent/master process et des slave/children process?

    Hiérarchiser les processes.

    Idem pr un fork dans un fork (process enfant d'enfant)

    Hiérarchiser les processes et/ou permettre (en tuant le père) de raboter la hiérarchie (technique connue sous le nom de double fork).

    Adhérer à l'April, ça vous tente ?

  • # anarchisme et psychanalyse

    Posté par  . Évalué à 1.

    je pensais pas aborder des notions de psychanalyse et d'anarchisme :p!

    je comprends la théorie. maintenant, tres concretement, à quoi ca me sert
    de cloner un process dans un script ?
    ce que je vois actuellement cest que ca crée un pid distinct mais visiblement cest aussi le cas quand je lance un programme depuis un bash.

    • [^] # Re: anarchisme et psychanalyse

      Posté par  . Évalué à 2. Dernière modification le 20 septembre 2020 à 18:09.

      ce que je vois actuellement cest que ca crée un pid distinct mais visiblement cest aussi le cas quand je lance un programme depuis un bash.

      Quand tu lances un programme depuis un bash, le bash utilise justement fork pour créer le nouveau process (qui exécute ce programme).

      En général fork ne s'utilise pas tout seul. Il est suivi de l'appel à exec (un parmi : execl, execlp, execle, execv, execvp, execvpe) :

      • fork duplique le process courant
      • exec exécute un autre programme
    • [^] # Re: anarchisme et psychanalyse

      Posté par  (site web personnel) . Évalué à 3.

      maintenant, tres concretement, à quoi ca me sert de cloner un process dans un script ?

      Si ça ne te sert pas, ne le fait pas.

      Si un jour tu veux exécuter différents programmes « en parallèle » plutôt que « l'un puis l'autre », revient y.

      ce que je vois actuellement cest que ca crée un pid distinct mais visiblement cest aussi le cas quand je lance un programme depuis un bash.

      Beh c'est aussi par le même mécanisme que ça se passe.

      Adhérer à l'April, ça vous tente ?

  • # ok

    Posté par  . Évalué à 1.

    ok, dans ce cas j'ai deux questions:

    pourquoi quand on lance un programme depuis un bash, le bash reste 'occupé' par ce programme (on ne peut pas lancer une autre commande depuis ce bash) puisque un autre process pid est crée? si je lance un script depuis un terminal, est ce que je peux "libérer" ce terminal avec fork ?

    est ce que indirectement, ca peut me permettre, par fork successif de définir une barre de progression dans un script (associé à d'autre commande qui m'indiquent la fin/bonne execution d'une commande dans un process différencié)?

    • [^] # Re: ok

      Posté par  . Évalué à 2.

      Pas besoin de fork. D'ailleurs, en shell, fork n'existe pas en tant que tel (à ma connaissance).
      Donc:

      • soit tu y penses avant, et tu tapes :
      $ monTruc.sh &
      

      Et là, monTruc.sh s'exécute et tu récupères la main. Les sorties standard et d'erreur de monTruc.sh vont se mélanger à ce que tu continueras à faire dans ton shell libre de toute entrave.

      • soit tu oublies, et, après coup, tu fais un <CTRL>+z, suivit d'un bg (pour background) :
      $ monTruc.sh
      ^Z
      $ bg
      

      Le résultat est quasiment le même.
      Un fg te permettra de remettre ton process au premier plan (foreground).

      Surtout, monTruc.sh lancé en arrière plan ne pourra pas interagir avec ce que tu pourrais entrer au clavier (entrée standard)

      • [^] # Re: ok

        Posté par  . Évalué à 2.

        Tu peux aussi utiliser tmux ou screen

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.