UNIX环境高级编程读书笔记(七)—进程环境 (1)

一、主要内容:

1.进程如何启动和退出的(main函数,初启函数,exit函数,atexit函数)。

1).Linux创建进程的唯一方法就是利用shellfork系统调用。

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( )用来分析命令行参数。参数argcargv是由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 exit2void

{

pritnf(“second exit handler/n”);

}

 

 

 

文章转自:http://blog.chinaunix.net/u1/59291/showart.php?id=538559

你可能感兴趣的:(UNIX环境高级编程读书笔记(七)—进程环境 (1))