Interprétation de la sortie STRACE – tuyaux et fourches

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.