strace中的execve之后系统调用从哪里来?他们在做什么?

我目前正在编写一个监视流程系统调用的程序,我需要更多地了解流程运行的基本机制。

这里是runner.c

>cat runner.c
#include "headers.h"
#include "helpers.h"

int main(int argc,char const *argv[])
{
        printf("Hello World\n");
        execlp("echo","echo","Runner",(char*)NULL);
        return 0;
}

如果我执行strace runner,则第一个调用是运行该程序的execve,但是所有调用都来自execve和打印write的实际Hello World之间?

>strace runner
execve("/media/sf_19-20/6CCS3PRJ/MVEE/c playground/runner",["runner"],0x7ffc61503c40 /* 42 vars */) = 0
brk(NULL)                               = 0x556111e53000
access("/etc/ld.so.preload",R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD,"/etc/ld.so.cache",O_RDONLY|O_CLOEXEC) = 3
fstat(3,{st_mode=S_IFREG|0644,st_size=79994,...}) = 0
mmap(NULL,79994,PROT_READ,MAP_PRIVATE,3,0) = 0x7fcdf2470000
close(3)                                = 0
openat(AT_FDCWD,"/lib/x86_64-linux-gnu/libc.so.6",O_RDONLY|O_CLOEXEC) = 3
read(3,"\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320l\2\0\0\0\0\0"...,832) = 832
fstat(3,{st_mode=S_IFREG|0755,st_size=1820104,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0x7fcdf24b3000
mmap(NULL,1832568,MAP_PRIVATE|MAP_DENYWRITE,0) = 0x7fcdf22b0000
mprotect(0x7fcdf22d5000,1642496,PROT_NONE) = 0
mmap(0x7fcdf22d5000,1339392,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE,0x25000) = 0x7fcdf22d5000
mmap(0x7fcdf241c000,299008,0x16c000) = 0x7fcdf241c000
mmap(0x7fcdf2466000,24576,0x1b5000) = 0x7fcdf2466000
mmap(0x7fcdf246c000,13944,MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,0) = 0x7fcdf246c000
close(3)                                = 0
arch_prctl(ARCH_SET_FS,0x7fcdf24b4500) = 0
mprotect(0x7fcdf2466000,12288,PROT_READ) = 0
mprotect(0x556110910000,4096,PROT_READ) = 0
mprotect(0x7fcdf24af000,PROT_READ) = 0
munmap(0x7fcdf2470000,79994)           = 0
fstat(1,{st_mode=S_IFCHR|0600,st_rdev=makedev(0x88,0),...}) = 0
brk(NULL)                               = 0x556111e53000
brk(0x556111e74000)                     = 0x556111e74000
write(1,"Hello World\n",12Hello World
)           = 12
execve("echo",["echo","Runner"],0x7ffcd1a7f358 /* 42 vars */) = -1 ENOENT (No such file or directory)
execve("/usr/local/sbin/echo",0x7ffcd1a7f358 /* 42 vars */) = -1 ENOENT (No such file or directory)
execve("/usr/local/bin/echo",0x7ffcd1a7f358 /* 42 vars */) = -1 ENOENT (No such file or directory)
execve("/usr/sbin/echo",0x7ffcd1a7f358 /* 42 vars */) = -1 ENOENT (No such file or directory)
execve("/usr/bin/echo",0x7ffcd1a7f358 /* 42 vars */) = 0
brk(NULL)                               = 0x5589c0f4e000
access("/etc/ld.so.preload",0) = 0x7fd49b1f0000
close(3)                                = 0
openat(AT_FDCWD,0) = 0x7fd49b237000
mmap(NULL,0) = 0x7fd49b030000
mprotect(0x7fd49b055000,PROT_NONE) = 0
mmap(0x7fd49b055000,0x25000) = 0x7fd49b055000
mmap(0x7fd49b19c000,0x16c000) = 0x7fd49b19c000
mmap(0x7fd49b1e6000,0x1b5000) = 0x7fd49b1e6000
mmap(0x7fd49b1ec000,0) = 0x7fd49b1ec000
close(3)                                = 0
arch_prctl(ARCH_SET_FS,0x7fd49b238580) = 0
mprotect(0x7fd49b1e6000,PROT_READ) = 0
mprotect(0x5589bf871000,PROT_READ) = 0
mprotect(0x7fd49b22f000,PROT_READ) = 0
munmap(0x7fd49b1f0000,79994)           = 0
brk(NULL)                               = 0x5589c0f4e000
brk(0x5589c0f6f000)                     = 0x5589c0f6f000
openat(AT_FDCWD,"/usr/lib/locale/locale-archive",O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD,"/usr/share/locale/locale.alias",st_size=2995,...}) = 0
read(3,"# Locale name alias data base.\n#"...,4096) = 2995
read(3,"",4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_IDENTIFICATION",st_size=368,368,0) = 0x7fd49b200000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache",O_RDONLY) = 3
fstat(3,st_size=26402,26402,MAP_SHARED,0) = 0x7fd49b1f8000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_MEASUREMENT",st_size=23,23,"/usr/lib/locale/en_US.utf8/LC_TELEPHONE",st_size=59,59,0) = 0x7fd49b028000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_ADDRESS",st_size=167,167,0) = 0x7fd49b020000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_NAME",st_size=77,77,0) = 0x7fd49b018000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_PAPER",st_size=34,34,0) = 0x7fd49b010000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_MESSAGES",{st_mode=S_IFDIR|0755,st_size=4096,...}) = 0
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES",st_size=57,57,0) = 0x7fd49b008000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_MONetaRY",st_size=286,286,0) = 0x7fd49b000000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_COLLATE",st_size=2586242,2586242,0) = 0x7fd49ad88000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_TIME",st_size=3284,3284,0) = 0x7fd49ad80000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_NUMERIC",st_size=54,54,0) = 0x7fd49ad78000
close(3)                                = 0
openat(AT_FDCWD,"/usr/lib/locale/en_US.utf8/LC_CTYPE",st_size=337024,337024,0) = 0x7fd49ad20000
close(3)                                = 0
fstat(1,...}) = 0
write(1,"Runner\n",7Runner
)                 = 7
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

我知道execve为新进程和类似的东西设置了所有内存(尽管我还不知道所有细节),但是在execve之后进行这些系统调用的代码在哪里?运行?我想看一下源代码。

在第二个execve之后也进行了几乎完全相同的调用。我假设内核将这些代码加载到进程的内存中,并在调用返回后开始运行。

这段代码到底在做什么?

谢谢。

qsylhh 回答:strace中的execve之后系统调用从哪里来?他们在做什么?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2547020.html

大家都在问