跟踪C程序的系统调用

时间:2019-02-18 15:40:36

标签: c io operating-system system-calls

我只是刚开始在操作系统上进行作业,而我实际上并不理解问题的答案,我目前在Ubuntu 16.04.5 LTS上以及MacOS上的VirtualBox上运行此代码。

我的任务是: 对于C程序中标记为LINE 4-LINE 8的行,通过解释您认为哪个系统调用来自程序的哪一行,将其与strace中的系统调用相关联。尝试为LINE 4-8解释为什么要使跟踪中发生这些系统调用。为了简化问题,您可以忽略以下系统调用:brk, readlink, access, fstat, lseek

这是要跟踪的程序的代码。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

void do_cleanup(void)
{
    printf("do cleanup\n");
} 

int main(int argc, char *argv[]) 
{
    int pid; // you can use these variables
    char buf[100];

    atexit(do_cleanup); // LINE 1
    setvbuf(stdout, 0, _IOLBF, 0); // LINE 2
    // setvbuf(stdout, 0, _IOFBF, 0); // LINE 3

    printf("Enter Name? "); // LINE 4
    pid = getpid(); // LINE 5
    scanf("%s", buf); // LINE 6
    printf("Hello %s\n", buf); // LINE 7
    printf(" your PID = %d\n", pid);  // LINE 8

    exit(EXIT_SUCCESS); // LINE 9
    //_exit(EXIT_SUCCESS);  // LINE 10
}

通过运行这些终端命令

gcc -static -o hello hello.c
strace ./hello 2>strace-output.txt >hello-output.txt

这就是我的痕迹

execve("./lab2-hello", ["./lab2-hello"], [/* 66 vars */]) = 0
uname({sysname="Linux", nodename="trial-VirtualBox", ...}) = 0
brk(NULL)                               = 0x1d1b000
brk(0x1d1c1c0)                          = 0x1d1c1c0
arch_prctl(ARCH_SET_FS, 0x1d1b880)      = 0
readlink("/proc/self/exe", "/home/student/Desktop/hello"..., 4096) = 37
brk(0x1d3d1c0)                          = 0x1d3d1c0
brk(0x1d3e000)                          = 0x1d3e000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
fstat(1, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
getpid()                                = 2407
fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 17), ...}) = 0
write(1, "Enter Name? ", 12)            = 12
read(0, "2\n", 1024)                    = 2
write(1, "Hello 2\n", 8)                = 8
write(1, " your PID = 2407\n", 17)      = 17
write(1, "do cleanup\n", 11)            = 11
lseek(0, -1, SEEK_CUR)                  = -1 ESPIPE (Illegal seek)
exit_group(0)                           = ?
+++ exited with 0 +++

我认为第4到8行的对应关系是这样,其中注释包含syscalls

printf("Enter Name? ");// write(1, "Enter Name? ", 12)            = 12

pid = getpid(); // getpid()                                = 2407

scanf("%s", buf); // read(0, "2\n", 1024)                    = 2

printf("Hello %s\n", buf);// write(1, "Hello 2\n", 8)                = 8

printf(" your PID = %d\n", pid);  // write(1, " your PID = 2407\n", 17)      = 17

但是,尝试读取这些对应行中的命令手册页时,我意识到,其中许多行甚至都不是系统调用,因为在MacOS中键入“通用命令手册”时就可以找到它们。有人知道我的身份是否有误?

更新

我知道不同的内核具有不同的手册页,并且在知道man 2 write存在之后,这是识别系统调用的另一种方法。但是,我仍然不理解通过C函数调用在幕后真正发生的事情,因为我仅将其视为C编程语言,只是提供了一些在幕后调用其相应系统调用的函数。

0 个答案:

没有答案