首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux系统编程-进程创建(fork)、外部程序调用(exec)

1. fork函数介绍 在linux中fork函数是非常重要的函数,它可以从已存在进程创建一个新进程。新进程为子进程,而原进程为父进程。...因此可以通过返回值来判断是父进程还是子进程。 fork函数创建进程的过程: 使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的所有资源,相当于就是父进程的一个副本。...#include pid_t fork(void); 制作分身 函数功能: 创建新的子进程. 子进程是父的进程一个副本...."退出的子进程的pid=%d\n",pid); } return 0; } 3. exec系列函数 exec系列函数是用于启动一个新的进程,将新的进程启动成功之后会覆盖原进程....\n"); return 0; } 4. system函数 system函数用于启动新的子进程,这个函数内部就是使用fork+exec+wait函数组合实现的。

3K20

Linux——进程管理篇(详解fork和exec

文章目录 Linux——进程管理篇(详解fork和exec) 如何在Linux编写与运行代码 编写 编译 运行 进程管理 fork system exec 总结 Linux——进程管理篇(详解fork...---- 进程管理 在Linux中,创建进程有如下两个目的: 将同一个程序分成多个进程进行处理(例如,使用Web服务器接收多个请求) 创建另-一个程序(例如,从bash启动一一个新的程序) 为了达成这两个目的...而这一点与我们后面要介绍的exec函数有点不一样。 ---- exec 我们接下来的exec函数是直接覆盖掉当前进程,也就是说,并没有增加新进程,而只是替换了当前进程。...主要的作用如下所示: 读取可执行文件,并读取创建进程的内存映像所需的信息。 用新进程的数据覆盖当前进程的内存。 从最初的命令开始运行新的进程。.../a", args, NULL); err(0, "exec() failed"); } else { // fork() 会返回新创建的子进程进程 ID(大于 1)给父进程,因此这里调用

2.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux进程控制】四、exec函数族——进程替换详解

    进程替换的概念 我们在使用fork()系统调用之后,创建出来的子进程是对父进程的复制,也就是说子进程和父进程执行的是相同的程序,虽然说父子进程可能执行的是不同的代码分支(if else语句),但是程序流程是一样...我们要想在新创建的子进程中执行其他程序,需要调用一种exec函数来拉起一个新的进程。当进程调用一种exec函数的时候,该进程的用户空间代码和数据全部被新程序替换掉,从新程序的启动例程开始执行。...需要注意的是,调用exec并不会创建进程,而是一种进程替换,所以调用exec前后,进程本身的ID不会改变。...这里面重要的是前两个execl和execlp函数,它们都用于使用一个新的进程去替换原来的进程,也就是在新创建进程中执行其他程序。...实际上shell是先fork()一个进程,然后在fork()创建的子进程中使用exec函数来拉起一个其它进程,这样fork()后的两个进程有一个是shell进程,一个是我们需要执行的进程,这才是exec

    15010

    关于linux进程间的close-on-exec机制

    3.2文件描述符与exec() 我们知道,默认情况下,由exec()的调用程序(这里指老的nginx master进程)所打开的所有文件描述符在exec()的执行过程中会保持打开状态,且在新的程序(这里指新的...尤其是在特权进程中来调用exec()来启动一个未知程序,亦或是新的程序并不需要这些已经打开的文件描述符。...在exec()调用后,close-on-exec标志为0的情况,此文件不被关闭;非零则在exec()后自动关闭。默认close-on-exec状态为0,需要通过FD_CLOEXEC设置。...Linux系统的open函数,其中flags参数可以传入O_CLOEXEC标记,即可自动设置上FD_CLOEXEC标记,但Linux内核版本2.6.23才开始支持此标记。...参考:《Linux/Unix系统编程手册》 扩展问题: 就是父子进程中的端口占用情况。

    2.8K30

    进程 (二).exec(2)

    exec 究竟是什么 root@ubuntu:/usr/include# grep int unistd.h | grep exec extern int execve (__const char...,如果成功就返回子进程进程ID给父进程,返回0给子进程,出错就返回-1 区别是在内存中vfork是进行COW(写时复制)的,fork是全部拷贝,因此vfork速度会更快,更省空间 ---- wait,...pid_t __pid, int *__stat_loc, int __options); 从上面的描述可以知道 wait(&status) 相当于 waitpid(-1,&status,0) 实际上Linux...WAIT_INT (status)) # define WIFSTOPPED(status) __WIFSTOPPED (__WAIT_INT (status)) ---- 总结 以下这些函数可以进行进程创建和简单的管理...fork waitpid/wait exec* 通过各方面资料弄懂其参数的意义和返回值的类型,是熟练掌握的基础 原文地址

    53320

    进程 (二).exec(1)

    前言 UNIX/Linux 是多任务的操作系统,那如何进行多任务处理呢,就是通过多个进程分别处理不同事务来实现 事实上一颗单核CPU,在一个时刻里只能处理一条指令,所以在微观的世界里只可能有一个进程正在运行...上一篇中使用fork进行了子进程创建,这时子进程还是一份父进程的拷贝,如果要让子进程可以完成父进程不一样的功能,就要用到进程的替换 进程的替换是通过 exec 函数族来实现的 这里分享一下我在学习进程过程中的笔记和心得...---- 概要 ---- 代码示例 要求 1.父进程(程序名process)产生一个子进程,用程序(z)替换 2.父进程等待子进程结束后,父进程才能结束 process进程:process.c 要求:... #include #include //exit 函数在里面声明 int main() { pid_t fret=0; //创建一个变量用来存放...fork返回值 fret=fork(); if(0 < fret) //如果pe的值大于0,就代表为父进程,fret的值就是子进程进程号 { int pid=0,status=

    41830

    linux进程创建进程终止

    01.进程创建 #include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后...,内核做: 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度 写时拷贝 02.进程终止 首先想清楚,终止是做什么...,父进程获取到的是最近一个子进程退出的退出码,前面我们提到,echo是内建命令,打印的都是bash内部的变量数据 父进程bash为什么要得到子进程的退出码呢?...进程出异常,本质是因为进程收到了OS发给进程的信号! 段错误,OS提前终止进程 我们可以看进程退出的时候,退出信号是多少,就可以判断我的进程为什么异常了! ! !...使用场景主要是在创建进程后,子进程完成任务立即退出时,或者在程序遇到无法恢复的错误需要立即终止时使用。 使用 exit() 当你需要正常终止程序,并且需要清理资源(如关闭文件、保存状态等)。

    9310

    关于linux进程间的close-on-exec机制

    关于linux系统端口查看和占用的解决方案 大部分这种问题都能够解决,在文章的最后,提到了一种特殊情况,就是父子进程中的端口占用情况。...刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着他们共享同一文件偏移量)。这其中当然也包含父进程创建的socket。...所以通常我们会fork子进程后在子进程中直接执行close关掉无用的文件描述符,然后再执行exec。...我们期望的是能在fork子进程前打开某个文件句柄时就指定好:“这个句柄我在fork子进程后执行exec时就关闭”。其实时有这样的方法的:即所谓 的 close-on-exec。...回到我们的应用场景中来,只要我们在创建socket的时候加上SOCK_CLOEXEC标志,就能够达到我们要求的效果,在fork子进程中执行exec的时候,会清理掉父进程创建的socket。

    3.1K30

    LinuxLinux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

    1.进程创建 1.1 fork函数 在linux中fork函数时非常重要的函数,它从已存在进程创建一个新进程。...\n"); return 1; } } return 0; } 运行结果: 4.进程程序替换 4.1 替换原理 用fork创建进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支...),子进程往往要调用一种exec函数以执行另一个程序。...调用exec并不创建进程,所以调用exec前后该进程的id并未改变 4.2 替换函数 其实有六种以exec开头的函数,统称exec函数 #include ` int execl(const...Linux鼓励将这种应用于程序之内的模式扩展到程序之间。如下图 一个C程序可以fork/exec另一个程序,并传给它一些参数。这个被调用的程序执行一定的操作,然后通过exit(n)来返回值。

    15410

    Linux】从 fork() 到 exec():理解 Linux 进程程序替换的魔法

    1.前言 进程程序替换是指一个进程用另一个新的可执行程序来替换当前正在执行的程序,这个过程通过通过exec系列函数完成。...在Linux或UNIX系统中,进程程序替换通常发生在一个进程通过fork()创建了子进程之后,子进程exec()函数加载和执行另一个程序。...当程序调用一种exec函数时,该进程的用户空间代码和数据完全被新的程序替换,从新程序的启动例程开始执行。 2.替换函数 exec函数是一个系列函数,负责替换当前进程的映像。...a child process,replacing myself with /bin/ls a.out pReplaceTest.c child process finished 在这个例子中: 父进程创建了一个子进程...它常用于父进程通过 fork() 创建进程后,子进程exec() 替换为新的程序来执行指定任务。 替换后的进程将完全抛弃原来的代码和数据,并开始执行新加载的程序。

    8510

    Linux下使用exec族函数进行进程替换

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/83692324 在Linux...下使用fork或者vfork函数创建的子进程是完全复制父进程的代码来执行的。...所以使用的时候应当注意,如果还想回到原来的进程继续执行,那么需要先使用fork函数来创建一个进程,在这个进程中使用exec函数来完成进程替换。这样才能保证原进程能在exec调用后不被破坏。...代码里的创建进程是上一篇博客提到的代码,在这里。 使用fork,而不是vfork的原因是vfork会于原进程共享地址空间,fork则是复制原进程,从而创建一个原进程的副本。...vfork则在exec函数调用之前的这段时间是和父进程共享数据的,直到遇到exec函数(或者是exit函数),才会成为一个独立进程,拥有自己的地址空间。不再和父进程共享地址空间。

    1.3K20

    Linux创建进程

    Linux的下是由父进程来完成的,创建完成的新进程是子进程对于子进程它有两种执行顺序的可能性: 父进程和子进程并发执行; 子进程先执行,父进程等待子进程执行完毕。...在Linux下的fork函数用于创建一个新的进程,使用fork()的函数来创建一个进程时,子进程只是完全复制父进程的资源。这样得到的子进程和父进程是独立的,具有良好的并发性。...Linux的采用了copy-on-write技术(COW),即:只有在子进程中发生写入操作的时候,才真正的去复制父进程的资源,否则不进行复制操作,比如在fork的子进程中只是调用exec函数来执行另外一个可执行文件...除了fork之外,Linux的系统还提供了vfork的函数来建立一个新进程.vfork建立的新进程和fork的不同之处在于: vfork创建的子进程和父进程是共享地址空间的,而不是复制,因此子进程中的数据和父进程中的数据是共享的...优点是,子进程和父进程的通信很好解决。 vfork创建的子进程必须调用_exit函数(或者使用exec函数调用另外的可执行程序)来结束它,否则子进程将不会结束。这点需要特别注意。

    2.1K10

    Linux系统下进程编程之exec族函数解析(四)

    在前面的文章里面,我们用fork()函数创建的子进程都是在程序中的if语句中写入代码,这样可以,但是不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须要知道源代码,而且源代码太长了也不好控制),...譬如说我们希望子进程来执行ls -la 命令就不行了(没有源代码,只有编译好的可执行程序);为了解决这种不灵活性,所以在Linux系统中引入了exec族函数。...一、族函数的引入: 1、族函数说明: fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。...2、在Linux中使用exec函数族主要有以下两种情况: a、当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数族让自己重生。...b、如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用任何一个exec函数使子进程重生。

    1.3K30

    linux find exec

    阅读目录(Content) 一. exec参数说明: 二. 使用示例 1. 查找当前目录下的文件,并对查找结果执行ls -l 命令 2....查找当前目录下的以.log结尾的文件或目录,并移动到test目录下 find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了...一. exec参数说明: -exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。...使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。...exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个,最后是一个分号。为了使用exec选项,必须要同时使用print选项。

    4.4K20

    Linux进程——进程创建(fork的原理)

    查看进程的第二种方法 在Linux系统中,不只有ps能够查看进程,还存在着一个动态目录proc,该目录存放了所有存在的进程,目录的名称。它会随着进程的改变而随时更新它的内容!...创建进程 2.1 系统调用函数fork 在Linux中,进程创建方式有两种: 命令行中直接启动进程 通过代码创建 而在用代码创建进程时,实则是进行了系统调用,这里我们就得在学习一个系统调用函数...首先我们来思考以下问题: 那么我们为什么要创建进程?子进程的作用是啥?...fork创建进程,系统中会多一个子进程 以父进程为模板,为子进程创建PCB 但是你今天创建的子进程,是没有代码和数据的!!!目前和父进程共享代码和数据!!...创建完成子进程,只是一个开始,创建完成子进程之后,系统的其他进程,父进程和子进程,接下来要被调度执行的,当父子进程的PCB都被创建并在运行队列中排队的时候,哪一个进程的PCB先被选择调度,那个进程就先运行

    19510

    Linux进程详解:进程创建&终止&等待&替换

    前言 之前在这两篇文章中 【Linux进程管理:状态与优先级调度的深度分析 【Linux进程详解:命令行参数、环境变量及地址空间-CSDN博客 我们已经了解过了进程的基本概念,这一章我们要进一步的学习进程...localhost linux]# ....进程程序替换 5.1 替换原理 用fork创建进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。...当进程调用一种exec函数时 该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行 调用exec并不创建进程,所以调用exec前后该进程的id并未改变 但是要注意两个问题❓ 当进程被另一个进程替换时...5.2 替换函数 进程替换函数是exec系列函数,而这一系列的函数一共有6个函数。

    23910
    领券