Interpreting STRACE output - pipes and forks

主宰稳场 提交于 2019-12-11 02:40:08

问题


I have the following code written in C, taken from https://beej.us/guide/bgipc/html/multi/pipes.html:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

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;
}

When compiling and running this code in the terminal using strace I get the following output:

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 */] <unfinished ...>
[pid  7304] execve("/bin/ls", ["ls"], [/* 55 vars */] <unfinished ...>
[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)               = ?
Process 7304 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
21
exit_group(0) 

Can anybody explain, line by line, what is going on in the strace output? I've attempted to research how to interpret strace outputs but haven't had any luck.

Thanks in advance.


回答1:


execve("./forks", ["./forks"], [/* 55 vars */]) = 0

The shell calls execve with your executable and ./forks as argv[0]. The /* 55 vars */ are the environment variables inherited from the shell.

arch_prctl(ARCH_SET_FS, 0x7f2b0e498700) = 0

Probably sets up thread local storage for the newly launched process.

pipe([3, 4])

The pipe system call returns a pair of descriptors, 3 and 4. The numbers are such because no descriptors other than 0 (stdin), 1 (stdout) and 2 (stderr) have been allocated so far to the process.

clone(Process 7304 attached child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2b0e4989d0) = 7304

The clone system call corresponds to the call to fork, spawning a new process. Even though fork is commonly referred to as a system call, particularly on Linux it wraps a call to clone(2).

[pid  7303] execve("/usr/bin/wc", ["wc", "-l"], [/* 55 vars */] <unfinished ...>
[pid  7304] execve("/bin/ls", ["ls"], [/* 55 vars */] <unfinished ...>
[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)

Within the parent and the child, two new executables are started. The child exits with [pid 7304] exit_group(0) and the parent immediately receives a SIGCHLD signal that a child process has changed its state.



来源:https://stackoverflow.com/questions/28767414/interpreting-strace-output-pipes-and-forks

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!