#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello World!\n");
return 0;
}
1. main函数的原型,以下形式较为正规
int main(void)
int main(int argc, char* argv[])
int main(int argc, char* argv[], char* env[])
#if 0
/*显示argv和env的内容**/
#include <stdio.h>
int main(int argc, char* argv[], char* env[])
{
int i = 0;
for(i=0;argv[i]!=NULL;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
for(i=0;env[i]!=NULL;i++)
{
printf("env[%d]=%s\n",i,env[i]);
}
return 0;
}
#endif
环境变量是从父进程继承过来的,通过setenv和getenv等函数可以存取环境变量,但对环境变量的修改只会影响当前进程及子进程,而不会影响父进程。
2. main函数的返回值
main函数的返回值是返回给父进程的,父进程调用下列函数来获取子进程的退出码(main函数的返回值)。
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
3. 被隐藏的细节
strace分析helloworld的执行过程
4. printf不见了
5. 链接了哪些共享库
ldd查看helloworld链接的共享库。
6. 调用共享库中的函数
7. 函数的解析过程
LD_DEBUG是一个很有用的环境变量
8. 托梁换柱
9. 内存模型
10.main函数不是第一个执行的函数
_start才是程序的入口,它先构造进程中的全局对象,执行一些初始化函数,然后调用main函数,最后析构全局对象,执行一些退出函数。
参考:《系统程序员成长计划》 9.3 HelloWord不能不说的十大秘密
《深入浅出HelloWord》 黄敬群
《深入理解计算机系统》