我只是刚开始在操作系统上进行作业,而我实际上并不理解问题的答案,我目前在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编程语言,只是提供了一些在幕后调用其相应系统调用的函数。