一、进程与信号之退出与终止

 C程序启动过程

  内核启动特殊例程

  启动例程

    在进程的main函数执行前会启动

    该例程放在在/lib/libc.so**中

    编译器在编译时会启动例程编译进可执行文件中

  启动例程作用

    搜索命令行参数传递给main函数中的argc、argv

    搜索环境信息构建环境表并传递给main函数

    等级进程终止函数

进程终止

  正常终止

    main函数返回

    调用exit(标准库函数)

    调用_exit或者_Exit(系统调用)

    最后一个线程从启动例程返回

    最后一个线程pthread_exit

  异常终止

    调用abort

    接受一个信号并终止返回

    最后一个线程对取消请求做处理相应

  进程返回

    成功返回0,否则非0

    shell中查看进程返回(echo $?)

自定义终止函数

#include <stdlib.h>
int atexit(void(*function)(void))
成功返回0,否则非0
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

void exit_fun1(void)
{
    printf("first exit_fun1\n");
}

void exit_fun2(void)
{
    printf("second exit_fun2\n");
}

void exit_fun3(void)
{
    printf("thread exit_fun3\n");
}

int main(int argc,char* argv[])
{
    if(argc<=2)
    {
        printf("usage: %s file[exit|_exit|return]\n",argv[0]);
        return 1;
    }
    
    //像内核注册函数
    atexit(exit_fun1);
    atexit(exit_fun2);
    atexit(exit_fun3); 
    
    FILE *fp=fopen(argv[1],"w");
    fprintf(fp,"hello word\n");
    
    //结束进程
    if(!strcmp(argv[2],"exit")) 
    {
        exit(0);
    }
    else if(!strcmp(argv[2],"return"))
    {
        return 0;
    }
    else if(!strcmp(argv[2],"_exit"))
    {
        _exit(0);
    }
    else
    {
        fprintf(stderr,"usage:%s file[exit|return|_exit]",argv[1]);
        return 1;
    }
}

执行结果

./signal_exit a.txt return

thread exit_fun3
second exit_fun2
first exit_fun1

./signal_exit a.txt exit

thread exit_fun3
second exit_fun2
first exit_fun1

./signal_exit a.txt _exit

 

posted @ 2016-08-27 11:20  jmst  阅读(1166)  评论(0编辑  收藏  举报