进程退出清理 atexit函数 vfork 函数 system 函数 创建子进程先执行, 父进程挂起 创建子进程与父进程共用一个地址空间

进程退出清理

#include <stdlib.h>

/*
 * 功能:
 *   注册进程正常结束前调用的函数,进程退出执行注册函数
 * 参数:
 *   function:进程结束前,调用函数的入口地址
 * 一个进程中可多次调用atexit函数注册清理函数,正常结束前调用函数的顺序和注册时的顺序相反
 */
int atexit(void(*function)(void));

例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void clear_fun1(void);
void clear_fun2(void);
void clear_fun3(void);

int main(int argc, char *argv[]) {
    atexit(clear_fun1);
    atexit(clear_fun2);
    atexit(clear_fun3);
    
    printff("process exit 3 sec later\n");
    sleep(3);
    return 0;
}

void clear_fun1(void) {
    printf("perform clear fun1\n");
}

void clear_fun2(void) {
    printf("perform clear fun2\n");
}

void clear_fun3(void) {
    printf("perfoorm clear fun3\n");
}

 

结果:

进程的创建 vfork 函数

        

/* *功能: * 该进程中创建一个新的进程 *return: * 成功:子进程中返回 0,父进程中返回子进程 ID * 失败:-1 */
pid_t vfork(void);

   fork 和 vfork 函数的区别:
         vfork 保证子进程先运行, 在它调用 exec 或 exit 之后, 父进程才可能被调度运行
         vfork 和 fork 一样都创建一个子进程, 但它并不将父进程的地址空间完全复制到子进程中, 因为子进程会立即,调用 exec(或 exit),所以不访问该地址空间
          相反,在子进程中调用 exec 或 exit 之前, 它在父进程的地址空间中运行, 在 exec 之后子进程会有自己的进程空间


    验证 vfork 创建子进程先执行, 父进程挂起
 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    pid_t pid;

    pid = vfork();
    if(pid < 0)
    {
        perror("vfork");
    }
    if(0 == pid)
    {
        int i = 0;
        for(i = 0; i < 5; i++)
        {
            printf("this is son process\n");
            sleep(1);
        }
        _exit(0);
    }
    else
    {
        while(1)
        {
            printf("this is father process\n");
            sleep(1);
        }
    }
    return 0;
}

 打印:

    验证 vfork 创建子进程与父进程共用一个地址空间

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int var = 10;

int main(int argc, char *argv[]) {
    pid_t pid;
    int num = 9;

    pid = vfork();

    if(pid < 0)
    {
        perror("vfork");
    }
    if(0 == pid)
    {
        var++;
        num++;
        printf("in son process var = %d, num = %d\n",var, num);
        _exit(0);
    }
    else
    {
        printf("in father process var = %d, num = %d\n",var, num);
    }
    return 0;
}

打印:

 

system 函数

#include <stdlib.h>

/* * 功能: * system 会调用 fork 函数产生子进程 * 子进程调用 exec 启动/bin/sh -c string 来执行参数 string 字符串所代表的命令 * 此命令执行完后返回原调用进程 * 参数: * 要执行的命令的字符串 * return: * 成功:command 为 NULL,则 system()函数返回非 0 * 失败:system()在调用/bin/sh 时失败,返回 127,其它原因返回-1 * 注意: * system 调用成功后会返回执行 shell 命令后的返回值 * 其返回值可能为 1、 127 也可能为-1,故最好应再检查 errno 来确认执行成功 */
int system(const char *command);

    例子:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
    int status;
    status = system("ls -alh");

    if(WIFEXITED(status))
    {
        printf("the exit status is %d\n",status);
    }
    else
    {
        printf("abnornamal exit\n");
    }
    return 0;
}

打印:

 
全部评论

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务