进程退出清理 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;
}

打印:

 
全部评论

相关推荐

昨天 16:14
已编辑
西安邮电大学 golang
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git&nbsp;commit,不会git&nbsp;pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗?&nbsp;哪怕是一个swap函数,开源项目里都经常注释:1&nbsp;3&nbsp;5&nbsp;7&nbsp;9&nbsp;2&nbsp;4&nbsp;6&nbsp;8&nbsp;10^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1.&nbsp;部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go……&nbsp;结果满脸懵的说ts是什么……我让看agent&nbsp;loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务