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多线程概述

时间: 2024-10-14 03:07:18

linux进程编程:子进程创建及执行函数简介的相关文章

Linux进程实践(1) --Linux进程编程概述

进程 VS. 程序 什么是程序? 程序是完成特定任务的一系列指令集合. 什么是进程? [1]从用户的角度来看:进程是程序的一次执行过程 [2]从操作系统的核心来看:进程是操作系统分配的内存.CPU时间片等资源的基本单位. [3]进程是资源分配的最小单位 [4]每一个进程都有自己独立的地址空间与执行状态. [5]像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程 进程数据结构 进程由三部分组成:PCB.程序段和数据段. 进程控制块PCB:用于描述进程情况及控制

Linux进程编程基础介绍

Linux系统是一个多进程的系统,它的进程之间具有并行性.互不干扰等特点.也就是说,每个进程都是一个独立的运行单位,拥有各自的权利和责任.其中,各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发生异常,它也不会影响到系统中的其他进程. Linux进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序.进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的基本实体. Linux进程是一个程序的一次执行的过程,同时也是资源分

创建自执行函数表达式

首先贴一段这样的代码 //正确的代码var foo=function(){ //函数内容 }; foo(); 对于这段代码大家都很熟悉,创建一个函数表达式并且立即执行.接下来,我们试着去把这段代码简化,变成一个立即执行函数表达式. //错误的代码function(){ //函数内容 }() 这段代码与上面代码的区别就是把foo省略了,直接替换成function,但是很明显这样做是不行的,js会给我们报出一个错误. 为什么这样会报错呢?其实原因很简单,函数声明以function关键字开始,同时函数

Linux 进程编程

Linux通过维护者五个状态来调度进程的运行.这五个状态分别为:运行.可中断.不可中断.僵死.停止 . PID来标识不同的进程的,Linux中每一个进程都有一个唯一的进程号 . PCB块就是一个进程资源 1.fork函数include <unistd.h>pid_t fork (void)返回值 0:子进程   子进程ID(大于0)   -1:出错使用fork函数得到的子进程是父进程的一个复制品.使用fork函数的代价很大,它复制了父进程中的代码段.数据段和堆栈段里的大部分内容. 2. exe

linux 文件编程c语言操作系统调用函数总结(一)

#include <fcntl.h> int open(const char *path, int oflag, ... /* mode_t mode */ ); int openat(int fd, const char *path, int oflag, ... /* mode_t mode */ ); open函数调用成功返回打开文件的文件描述符,失败时返回-1.oflag参数表明打开文件的状态标志,必须且只能包含以下5个标志中的一个: O_RDONLY:只读打开 O_WRONLY:只写

Linux网络编程中tcp_server和tcp_client函数的封装

本文的主要目的是将server套接字和client套接字的获取,做一个简易的封装,使用C语言完成.   tcp_server   服务器端fd的获取主要分为以下几步: 1.创建socket,这一步仅仅创建一个socket,没有任何特性的属性. 2.绑定网卡和port,一块主机可能有多块网卡,如果我们使用INADDR_ANY,意味着后面接受的TCP连接可以绑定在任意一块网卡上. 例如某台主机的ip地址有两个:192.168.44.136.10.1.1.4,假设绑定的ip采用INADDR_ANY,端

Linux Shell编程学习笔记一:shell简介

Q:什么是Shell,什么是shell脚本? A:Shell是一种用C语言编写的程序,它是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.它是命令语言.命令解释程序及程序设计语言的统称.它的作用就是遵循一定的语法将输入的命令加以解释并传给系统. 命令解释程序:shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用.用户在提示符下输入的命令都由shell先解释然后传给Linux核心.

Linux C编程学习1---C语言基础(简介、预处理……)

C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语言的一些特点,既可以像汇编语言那样直接访问硬件的功能,也具有高级语言那样面向用户容易记忆.便于阅读和书写的优点 C语言的可移植性很好,C语言中没有依赖于硬件的输入输出语句,输入输出功能都是通过调用库函数来实现的,所以在一种计算机平台上开发的程序不需要进行修改或者只需要进行简单的修改就可以移植到另外的

linux系统编程-进程

进程 现实生活中 在很多的场景中的事情都是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的: 如下是一段视频,迈克杰克逊的一段视频: http://v.youku.com/v_show/id_XMzE5NjEzNjA0.html?&sid=40117&from=y1.2-1.999.6 试想:如果把唱歌和跳舞这2件事分开以此完成的话,估计就没有那么好的效果了 程序中 如下程序,来模拟"唱歌跳舞" 这件事情 11 from time impo