标签:
这些天请假在家,正好可以研究一下UNIX高级编程,以前对高编也有写概念,知道些名词,什么标准I/O,进程,线程啥的,仅此而已。翻了些书本,知道进程入门分四个步骤:
进程环境,进程控制,进程关系,信号。今儿咱们就从第一步开始。
一 概述
关于进程环境,主要对8个细节进行说明:
1.程序执行是main函数如何被调用;
2.命令行参数如何传送给可执行程序;
3.进程的终止方式;
4.存储器的经典布局;
5.额外存储空间的分配方法;
6.进程对环境变量的使用;
7.longjmp和setjmp函数及它们与栈的交互作用;
8.进程的资源限制;
二 细节说明
1.main函数
main函数的原型是:
1 int main(int argc,char **argv,char **envp);
argc:命令行参数的数目;
argv[]:指向命令行参数的 各个指针所构成的数组;
envp[]:环境变量表;
C程序总是从main函数开始执行。
内核执行C程序的顺序是:内核->调用一个exec->C启动例程->main;
程序的其实地址:可执行文件将此启动例程指定为程序起始地址。这是由编辑连接器设置的,连接器由C编译器调用那个,也就是程序编译中,预处理 编译和链接中的链接过程。
命令行参数获取:启动例程从内核取得命令行参数和环境变量的值,为按上述方式调用main做好准备。
2.命令行参数
下面两个demo显明了命令行参数的一些用法。
1 /************************************************************************* 2 File Name: cmd_line.c 3 Author: wangshukun 4 Mail: shuk.wang@hotmail.com 5 Created Time: Fri 26 Jun 2015 05:25:50 PM CST 6 *************************************************************************/ 7 8 #include <stdio.h> 9 10 int main(int argc,char **argv,char **envp) 11 { 12 int i; 13 14 for(i = 0;i < argc;i++) 15 { 16 printf("argv[%d] = %s.\n",i,argv[i]); 17 } 18 19 for(i = 0;envp[i] != NULL;i++) 20 { 21 printf("envp[%d] = %s.\n",i,envp[i]); 22 } 23 return 0; 24 }
argv[argc]为NULL,envp[last]也为NULL,所以程序亦可写成这样:
1 /************************************************************************* 2 File Name: cmd_line.c 3 Author: wangshukun 4 Mail: shuk.wang@hotmail.com 5 Created Time: Fri 26 Jun 2015 05:26:00 PM CST 6 *************************************************************************/ 7 8 #include <stdio.h> 9 10 int main(int argc,char **argv,char **envp) 11 { 12 int i; 13 14 for(i = 0;argv[i] != NULL;i++) 15 { 16 printf("argv[%d] = %s.\n",i,argv[i]); 17 } 18 19 for(i = 0;envp[i] != NULL;i++) 20 { 21 printf("envp[%d] = %s.\n",i,envp[i]); 22 } 23 return 0; 24 }
gcc cmd_line.c后生成a.out。运行./a.out a b c即可看到参数列表和环境变量表。
3.进程终止方式
标签:
原文地址:http://www.cnblogs.com/shuk-notes/p/4602870.html