J’ai le code suivant écrit en C, tiré de https://beej.us/guide/bgipc/html/multi/pipes.html :
#include #include #include int main(void) { int pfds[2]; pipe(pfds); if (!fork()) { close(1); /* close normal stdout */ dup(pfds[1]); /* make stdout same as pfds[1] */ close(pfds[0]); /* we don't need this */ execlp("/bin/ls", "ls", NULL); } else { close(0); /* close normal stdin */ dup(pfds[0]); /* make stdin same as pfds[0] */ close(pfds[1]); /* we don't need this */ execlp("/usr/bin/wc", "wc", "-l", NULL); } return 0; }
Lors de la compilation et de l’exécution de ce code dans le terminal à l’aide de strace, j’obtiens le résultat suivant:
execve("./forks", ["./forks"], [/* 55 vars */]) = 0 arch_prctl(ARCH_SET_FS, 0x7f2b0e498700) = 0 pipe([3, 4]) = 0 clone(Process 7304 attached child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2b0e4989d0) = 7304 [pid 7303] execve("/usr/bin/wc", ["wc", "-l"], [/* 55 vars */] [pid 7304] execve("/bin/ls", ["ls"], [/* 55 vars */] [pid 7303] ) = 0 [pid 7304] ) = 0 [pid 7303] arch_prctl(ARCH_SET_FS, 0x7f558acde700) = 0 [pid 7304] arch_prctl(ARCH_SET_FS, 0x7f4bef4f67c0) = 0 [pid 7304] exit_group(0) = ? Process 7304 detached --- SIGCHLD (Child exited) @ 0 (0) --- 21 exit_group(0)
Quelqu’un peut-il expliquer, ligne par ligne, ce qui se passe dans la sortie de strace? J’ai essayé de chercher comment interpréter les sorties de strace mais je n’ai pas eu de chance.
Merci d’avance.
execve("./forks", ["./forks"], [/* 55 vars */]) = 0
Les appels de shell execve
avec votre exécutable et ./forks
sous la forme argv[0]
. Les /* 55 vars */
sont les variables d’environnement héritées du shell.
arch_prctl(ARCH_SET_FS, 0x7f2b0e498700) = 0
Configure probablement le stockage local de thread pour le processus nouvellement lancé.
pipe([3, 4])
L’appel de système de pipe
renvoie une paire de descripteurs, 3
et 4
. Les nombres sont tels parce qu’aucun descripteur autre que 0
(stdin), 1
(stdout) et 2
(stderr) n’a été affecté jusqu’à présent au processus.
clone(Process 7304 attached child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2b0e4989d0) = 7304
L’appel système clone
correspond à l’appel à fork
, créant un nouveau processus. Bien que fork
soit généralement appelé un appel système, en particulier sous Linux, il encapsule un appel à clone(2)
.
[pid 7303] execve("/usr/bin/wc", ["wc", "-l"], [/* 55 vars */] [pid 7304] execve("/bin/ls", ["ls"], [/* 55 vars */] [pid 7303] <... execve resumed> ) = 0 [pid 7304] <... execve resumed> ) = 0 [pid 7303] arch_prctl(ARCH_SET_FS, 0x7f558acde700) = 0 [pid 7304] arch_prctl(ARCH_SET_FS, 0x7f4bef4f67c0) = 0 [pid 7304] exit_group(0)
Dans le parent et l’enfant, deux nouveaux exécutables sont démarrés. L’enfant se [pid 7304] exit_group(0)
avec [pid 7304] exit_group(0)
et le parent reçoit immédiatement un signal SIGCHLD
indiquant qu’un processus enfant a changé d’état.