argc来自哪里?

时间:2012-01-21 14:52:57

标签: c++ c linux unix process

fork / exec创建了一个新进程。 Exec设置命令行参数,但我没有看到它设置了放入argc的参数的数量。

main()应该是在新流程中运行的第一个函数,但是argc已经设置好了。

它在哪里设定?它必须是某种设置代码,它在调用main之前对参数进行计数,但我读过的内容都没有解释这个设置代码的作用或它所处的位置。

这是libc吗?这在每个操作系统上是否相同并且由某些规范涵盖?除了这个之外,我还能在哪里找到设置代码中的内容?它是在实例化全局变量之前调用的吗?

4 个答案:

答案 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,你应该能够找到源代码。