fork / exec创建了一个新进程。 Exec设置命令行参数,但我没有看到它设置了放入argc
的参数的数量。
main()
应该是在新流程中运行的第一个函数,但是argc
已经设置好了。
它在哪里设定?它必须是某种设置代码,它在调用main
之前对参数进行计数,但我读过的内容都没有解释这个设置代码的作用或它所处的位置。
这是libc
吗?这在每个操作系统上是否相同并且由某些规范涵盖?除了这个之外,我还能在哪里找到设置代码中的内容?它是在实例化全局变量之前调用的吗?
答案 0 :(得分:6)
在调用main
之前,大多数实现都会发生很多事情(通常是由类似于crt0
的环境设置的,C运行时启动)。
在 main
退出后,可能会发生很多事情,例如资源关闭,atexit
退出处理程序等等。
C标准只涵盖了语言方面的内容,而不是实体如何在封面下完成工作(这基本上就是你所要求的)。每个实现可能以不同的方式执行操作,但许多UNIX类型将具有类似前面提到的crt0
进行设置的内容。
答案 1 :(得分:0)
操作系统会处理它。毕竟,它是处理线程和进程的操作系统。
答案 2 :(得分:0)
使用fork导致在下一行代码处继续。 Exec函数系列创建一个新的执行,具体取决于你使用函数的第二个参数可能是参数数组。
#include <unistd.h>
int ret;
char *cmd[] = { "ls", "-l", (char *)0 };
char *env[] = { "HOME=/usr/home", "LOGNAME=home", (char *)0 };
...
ret = execve ("/bin/ls", cmd, env);
答案 3 :(得分:0)
在C和C ++中,main()
从mainCRTStartup()
或类似函数调用,具体取决于您的构建工具。如果你打破调试器并检查callstack,你应该能够找到源代码。