zoukankan      html  css  js  c++  java
  • linux进程编程:子进程创建及执行函数简介

    linux进程编程:子进程创建及执行函数简介

    子进程创建及执行函数有三个:

    (1)fork();
    (2)exec();
    (3)system();
        下面分别做详细介绍。
    (1)fork()
        函数定义:
        pid_t fork();
        函数说明:
        linux下进程在内存中由三部分数据组成:代码段、数据段、堆栈段。在一个进程中,调用fork函数,可以创建、启动一个新进程。新进程与父进程共享代码段,复制父进程的数据段和堆栈段。创建成功后,fork()会向两个进程都有返回值。向父进程的返回值为子进程的进行号,向子进程的返回值为0。由于两个进程共享代码段,我们就利用两个返回值的不同,通过if...else...区分两进程在子进程启动后的运行情况。
        返回值:
        创建成功后,fork()会向两个进程都有返回值。向父进程的返回值为子进程的进行号,向子进程的返回值为0。函数调用失败返回值为-1。错误原因存在于errno中。

    (2)exec()函数族
        exec函数族共6个函数,函数原型:
        int execl(const char *path, const char *arg, ...);
        int execlp(const char *file, const char *arg, ...);
        int execle(const char *path, const char *arg, ..., char *const envp[]);
        int execv(const char *path, char *const arg[]);
        int execvp(const char *file, char *const arg[]);
        int execve(const char *path, char *const arg[], char *const envp[]);
        函数族说明:
        exec()函数族通过指定路径或文件名的方式找到并执行一个可执行文件。该可执行文件可以使二进制文件或linux系统下可执行的shell脚本文件,一旦执行即替代原进程代码,废除原进程数据段和堆栈段,但仍然沿用原进程的进程号。换句话说,原进程运行的程序已经换成了新的程序,但对系统而言还是同一个进程。如果我们的程序向启动另一个程序的执行,还想原进程继续运行,可以将fork和exec结合使用,先创建新进程,然后再新进程中使用exec调用需要启动的程序。
        函数返回值:
        exec()函数族的函数执行成功后没有返回值,调用失败时才会返回-1,原程序由调用点继续往下执行。
    (3)system()
        函数定义:
        int system(const char *file);
        函数说明:
        system()相当于fork与execl的组合。首先由fork()函数建立了一个子进程,然后由execl()函数根据参数file给定的文件名找到并执行可执行文件。
        system()与exec函数族都可执行进程外的命令,区别是system()函数在原程序上创建一个新的进程,再在新进程中执行可执行文件;而exec函数族是在新开辟的进程中植入新代码替代原程序代码。
        函数返回值:
        函数调用成功返回0;调用失败返回-1。若返回值的8~15位为127,则system()中的execl函数执行失败。

    以上转至:linux进程编程:子进程创建及执行函数简介

    最后补充一下,如果用fork复制进程,那么在复制进程后调用的程序/应用内部一定要记得exit(0);做退出处理,不然会出现僵尸进程。

    而且你会发现哪怕你在被调用的程序/应用A里面有做exit处理,下次继续fork()得到的gid会依次递增,不会复用上一个pid,为什么呢?

    别着急,这是缓存机制,进程一旦退出,进程号可以重用的,但是为了避免误认为是之前退出的进程,会有一定的延迟,不用担心进程ID被你消耗完。

    所以,放心,会重复利用的。一直加,加到最大,在重小的开始,又来一轮。

    也可以参考下这篇文章:Linux多线程概述

  • 相关阅读:
    线段树题胡乱整理
    【テンプレート】RMQ
    【説明する】线段树
    【テンプレート】字符串hash
    [HDOJ3718]Similarity(KM算法,二分图最大匹配)
    [HDOJ3714]Error Curves(三分)
    [HDOJ3711]Binary Number(枚举)
    [HDOJ3709]Balanced Number(数位dp)
    [HDOJ5542]The Battle of Chibi(DP,树状数组)
    [HDOJ5543]Pick The Sticks(DP,01背包)
  • 原文地址:https://www.cnblogs.com/1024Planet/p/5901363.html
Copyright © 2011-2022 走看看