Chinaunix首页 | 论坛 | 博客
  • 博客访问: 425153
  • 博文数量: 47
  • 博客积分: 1669
  • 博客等级: 上尉
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-04 23:27
文章分类

全部博文(47)

文章存档

2011年(23)

2010年(24)

分类: LINUX

2010-11-24 10:56:24

有五种方式使进程终止:
(1) 正常终止:
(a) 从main返回。
(b) 调用exit。
(c) 调用_exit。
(2) 异常终止:
(a) 调用abort
(b) 由一个信号终止
上节提及的起动例程是这样编写的,使得从main返回后立即调用exit函数。如果将起动例程以C代码形式表示(实际上该例程常常用汇编语言编写),则它调用main函数的形式可能是:
exit( main(argc, argv) );
exit和_exit函数
exit和_exit函数用于正常终止一个程序: _exit立即进入内核, exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I / O流等),然后进入内核。
#include
void exit(int status);
#include
void _exit (int status) ;
使用不同头文件的原因是:exit是由ANSI C说明的,而_exit则是由POSIX.1说明的。
由于历史原因, exit函数总是执行一个标准I/O库的清除关闭操作:对于所有打开流调用fclose函数。exit和_exit都带一个整型参数,称之为终止状态( exit status)。大多数UNIX shell都提供检查一个进程终止状态的方法。如果(a)若调用这些函数时不带终止状态,或(b)main执行了一个无返回值的return语句,或(c) main执行隐式返回,则该进程的终止状态是末定义的。这就意味着,下列经典性的C语言程序:
#include
main ()
{
printf ("hello, world \n");
}
是不完整的,因为main函数没有使用return语句返回(隐式返回),它在返回到C的起动例程时并没有返回一个值(终止状态)。另外,若使用:
return(0);
或者
exit(0);
则向执行此程序的进程(常常是一个shell进程)返回终止状态0。另外,main函数的说明实际上应当是:
int main(void)
将main说明为返回一个整型以及用exit代替return,对某些C编译程序和UNIXlint(1)程序而言会产生不必要的警告信息,因为这些编译程序并不了解main中的e x i t与r e t u r n语句的作用相同。警告信息可能是“ control reaches end of nonvoid f u n c t i o n(控制到达非v o i d函数的结束)”。避开这种警告信息的一种方法是:在m a i n中使用r e t u r n语句而不是e x i t。但是这样做的结果是不能用U N I X的g r e p公用程序来找出程序中所有的e x i t调用。另外一个解决方法是将m a i n说明为返回v o i d而不是i n t,然后仍旧调用e x i t。这也避开了编译程序的警告,但从程序设计角度看却并不正确。本章将m a i n表示为返回一个整型,因为这是ANSI C和P O S I X . 1所定义的。我们将不理会编译程序不必要的警告。

atexit函数
按照ANSI C的规定,一个进程可以登记多至3 2个函数,这些函数将由e x i t自动调用。我们称这些函数为终止处理程序(exit handler),并用a t e x i t函数来登记这些函数。
#include
int atexit(void f( u* n c) ( v o i d ) ) ;
返回:若成功则为0,若出错则为非0。其中, a t e x i t的参数是一个函数地址,当调用此函数时无需向它传送任何参数,也不期望它返回一个值。e x i t以登记这些函数的相反顺序调用它们。同一函数如若登记多次,则也被调用多次。终止处理程序这一机制由ANSI C最新引进。S V R 4和4 . 3 + B S D都提供这种机制。系统V的早期版本和4 . 3 B S D则都不提供此机制。
根据ANSI C和P O S I X . 1,e x i t首先调用各终止处理程序,然后按需多次调用f c l o s e,关闭所有打开流。
 
注意,内核使程序执行的唯一方法是调用一个e x e c函数。进程自愿终止的唯一方法是显式或隐式地(调用e x i t )调用_ e x i t。进程也可非自愿地由一个信号使其终止
实例
 
程序7 - 1说明了如何使用a t e x i t函数。执行程序7 - 1产生:
$ a . o u t
main is done
first exit handler
first exit handler
second exit handler
注意,在m a i n中没有调用e x i t,而是用了r e t u r n语句。
程序7-1 终止处理程序实例

#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);
int
main(void)
{
if (atexit(my_exit2) != 0)
err_sys("can't register my_exit2");
if (atexit(my_exit1) != 0)
err_sys("can't register my_exit1");
if (atexit(my_exit1) != 0)
err_sys("can't register my_exit1");
printf("main is done\n");
return(0);
}
static void
my_exit1(void)
{
printf("first exit handler\n");
}
static void
my_exit2(void)
{
printf("second exit handler\n");
}


阅读(4748) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-24 14:26:37

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com