一、主要内容:
1.进程如何启动和退出的(main函数,初启函数,exit函数,atexit函数)。
(1).Linux创建进程的唯一方法就是利用shell的fork系统调用。
(2).编译C程序时,连接器会将初启函数和main函数一起装入内存形成可执行文件,指定该初起函数为该初启函数的开始执行点。
(3).初启函数负责从UNIX SHELL获得命令行参数和系统的环境变量,将它们组织成main函数需要的形式,并调用main函数。
(4).当C程序从main返回时,初启函数负责调用exit函数中止进程。
(5).初启函数也是由shell创建的。也是shell的子进程。
2.命令行参数
(1).命令行参数分为两种,一种是选项参数,如-l –u 。一种是非选项参数,大多是文件名或路径名。
(2).对于系统,程序得到命令行参数有两种办法。
通过初起函数得到。
由父进程传递给子进程。
(3).对于程序,程序得到命令行参数的唯一方法是通过argc,argv.
(4).当参数个数固定或所以的参数都可按相同的方式理解,可直接用argc,argv获得。
(5).当参数有选项参数和非选项参数混合时,可使用getopt函数对选项参数进行逐一扫描,实现区分。但必须对选项参数进行语法约定。
(6).选项参数的约定有:
(一) 选项参数必须以”-“开头。
(二) 当选项不需要值的时候可以连着写。
(三) 选项参数必须写在它的非选项参数之前。
二、命令行参数
1.
名称:: |
getopt |
功能: |
扫描选项参数 |
头文件: |
#include <unistd.h> |
函数原形: |
int getopt(int argc,char *const argv[],const char *optstring); |
参数: |
argc argv opestring 选项参数 |
返回值: |
|
getopt( )用来分析命令行参数。参数argc和argv是由main( )传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。
返回值:如果找到符合的参数,则返回此参数字母.如果参数不包含在参数optstring 的选项字母,则返回字符,分析结束则返回-1
getopt(argc,argv,”islf”);
./a.out –i –x –l –s file1
如果在一个选项后面有“:”,那么该选项后面必须带有值。
getopt(argc,argv,”is:lf”);
和getopt有关的4个全局变量
1. opterr
当opterr等于0的时候,遇到非法的选项字符时,或者选项要求有值而缺省时,它会打印“?”。缺省时opterr是等于0的。
当opterr不等于0的时候,遇到非法的选项字符时,或者选项要求有值而缺省时,它会打印一条出错信息到标准输出。
还有一种情况时,第三个参数的开头是一个“:”,可以通过opterr区分它是因为遇到非法的选项字符(返回”?”),还是选项要求有值而缺省出错(返回“:”)。 如:
getopt(argc,argv,”:ls:if”);
./a.out –i –f –s –l file1
2.optopt——一但出现两种异常的时候,optopt会把它出错信息存储起来。
3. optind——argv存放下一个要处理元素的索引,初值为1。
4.optarg——若选项要求有值需接收值,optarg指向选项的值。
/7_1.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>
main(int argc,char *argv[]) { int c;
while((c=getopt(argc,argv,”:d:s:))!=-1) { switch(c) { case ‘d’: printf(“d/n”); printf(“%s/n”,optarg); break; case ‘s’: printf(“s/n”); printf(“%s/n”,optarg); break; case ‘?’: printf(“?/n”); break; case ’:’: printf(“:/n”); break; default: printf(“default”); } } exit(0); }
|
三、终止进程
1.
名称:: |
exit/_exit |
功能: |
终止一个进程 |
头文件: |
#include <stdlib.h> (exit) #include <unistd.h>(_exit) |
函数原形: |
void exit(int status); void _exit(int status); |
参数: |
status 终止状态 |
返回值: |
无 |
exit和_exit函数用于正常终止一个程序:_exit立即进入内核,exit则先执行一些清除处理,然后进入内核。
exit函数总是执行一个标准I/O库的清除关闭操作,对于所有打开流调用fclose函数,把所缓存中的所有数据都写到文件中。
exit和_exit函数都带一个参数,称为终止状态,大多数UNIX Shell都提供检查一个进程终止状态的方法。
2.
名称:: |
atexit |
功能: |
register a function to be called at normal program termination. |
头文件: |
#include <stdlib.h> |
函数原形: |
int atexit(void(*function)(void)); |
参数: |
function 函数的地址 |
返回值: |
若成功则为0,否则不为0。 |
一个函数可以最多登记32个函数,这些函数将由exit自动调用,我们称这些函数为终止处理函数,用stexit登记它们。
其中,atexit的参数是一个函数地址,当调用此函数时无需向它传递任何参数,也不期望它返回一个值。exit以登记这些函数的相反顺序调用它们。同一函数如若登记多次,则也被调用多次。
exit首先调用各终止处理函数,然后按需多次调用fclose关闭所有打开流。
下面是一个实例:
/*7_2.c*/ #include <stdlib.h> #include <stdio.h>
static void exit1(void); static void exit2(void);
int main() { if(atexit(exit1)!=0) printf(“can’t register exit 1” ); if(atexit(exit2)!=0) printf(“can’t register exit 2” ); pritnf(“main is done/n”); return(0); }
static void exit1(void) { pritnf(“first exit handler/n”); }
static void exit2(void) { pritnf(“second exit handler/n”); } |
文章转自:http://blog.chinaunix.net/u1/59291/showart.php?id=538559