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

fork,wait和exec

fork,wait和exec fork系统调用 wait系统调用 exec系统调用 为什么要把fork和exec分开 ---- fork系统调用 1、子进程不会从 main()函数开始执行,而是直接从...fork()系统调用返回。...2、子进程拥有自己的地址空间(即拥有自己的私有内存)、寄存器、程序计数器等 3、父进程获得的返回值是新创建子进程的 PID,而子进程获得的返回值是 0 4、子进程和父进程的运行顺序取决于CPU调度顺序...子进程执行 exec()之后,几乎就像p3.c 从未运行过一样。...和exec分开 在构建UNIX shell 的时候非常有用,因为这给了shell 在fork 之后exec 之前运行代码的机会,这些代码可以在运行新程序前改变环境,实现一些有趣的功能。

1K20

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

文章目录 Linux——进程管理篇(详解fork和exec) 如何在Linux编写与运行代码 编写 编译 运行 进程管理 fork system exec 总结 Linux——进程管理篇(详解fork...和exec) 这篇文章,主要的目的就是帮助同学们完成操作系统的实验,因为考虑到很多同学第一次接触Linux,相当不习惯命令行的操作方式,所以我会详细来介绍,相信只要跟着步骤一步一步来,就一定能完成我们的实验...,Linux 提供了fork()函数与execve()函数,接下来,我们将介绍如何使用这两个函数。...有些同学可能好奇了,为什么if和else同时执行了呢?其实很简单,就是因为这是两个进程,一个进程运行了一个。...---- 总结 其实说分析system()和exec()两个函数的区别,也就是分析fork和exec的区别,而他们之间的区别,简单一点来描述就是fork是复制,exec是覆盖。

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

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

    在Linux或UNIX系统中,进程程序替换通常发生在一个进程通过fork()创建了子进程之后,子进程用exec()函数加载和执行另一个程序。...也就是说,进程程序替换就是在不改变进程的PID(进程ID)的情况下,用一个全新的程序来替换当前的内存空间和执行内容。...2.3.1 execlp函数 execlp函数和execl函数的区别在于,execlp在第一个参数时候,不需要全路径,只需要写上执行命令的文件名即可,表示你需要执行谁,往后也就是和execl的参数一样。...总结 进程程序替换是指用一个新的可执行程序替换当前进程的内存空间和执行内容,但进程ID不变。 常用的替换函数是 exec 系列函数(如 execl()、execvp())。...它常用于父进程通过 fork() 创建子进程后,子进程用 exec() 替换为新的程序来执行指定任务。 替换后的进程将完全抛弃原来的代码和数据,并开始执行新加载的程序。

    11010

    linux find exec

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

    4.4K20

    Linux之find exec

    exec解释 -exec参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。...使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如ls或ls -l这样的命令。...exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。...-exec使用grep > find / -name "passwd*" -exec grep "root" {} \; 任何形式的命令都可以在-exec选项中使用。.../rumenz \; 原文链接:https://rumenz.com/rumenbiji/linux-find-exec.html 微信公众号:入门小站

    3.9K00

    Linux之find exec

    exec解释 -exec参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。...使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如ls或ls -l这样的命令。...exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。...-exec使用grep > find / -name "passwd*" -exec grep "root" {} \; 任何形式的命令都可以在-exec选项中使用。...-name "*.log" -exec mv {} ../rumenz \;

    4K20

    Linux之find exec

    exec解释 -exec参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。...使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如ls或ls -l这样的命令。...exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。...-exec使用grep > find / -name "passwd*" -exec grep "root" {} \; 任何形式的命令都可以在-exec选项中使用。...-name "*.log" -exec mv {} ../rumenz \; 原文链接:https://rumenz.com/rumenbiji/linux-find-exec.html

    3.6K20

    Linux之find exec

    exec解释 -exec参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。...使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如ls或ls -l这样的命令。...exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。...-exec使用grep > find / -name "passwd*" -exec grep "root" {} \; 任何形式的命令都可以在-exec选项中使用。...-name "*.log" -exec mv {} ../rumenz \; 原文链接:https://rumenz.com/rumenbiji/linux-find-exec.html

    3.9K30

    Linux多进程(fork)

    进程概念: 一个进程是一次程序执行的过程,它和程序不同,程序是静态的,它是一些保存在磁盘上可执行的代码和数据的集合,而进程是一个动态概念,也是操作系统分配资源的最小单位 fork和exec是两个重要的系统调用...,fork的作用是根据现有的进程复制出一个新的进程,原来的进程称为父进程,新的进程成为子进程, 系统中运行着很多进程,这些进程都是从开始的一个进程一个一个复制出来的。...#include #include pid_t fork(void); fork调用失败返回-1,调用成功在父子进程中的返回值不一样,子进程中返回0,父进程中返回的数值大于...include //输入输出函数 int main(void){ pid_t pid; char * message; int n; pid = fork...(); if(pid < 0){ perror("fork failed"); } if(pid == 0){ n = 6;//父子进程变量n互不影响

    2.1K30

    Linux的fork使用

    Linux的fork使用 fork函数可以算是Linux里有点不好明白的函数了,调用一次,返回两次,虽然在平时的写法中,有基本固定的写法,但是有时候看起来还是有些让人头疼的。...因此,使用 fork()函数的代价是很大的。 ? 日常使用fork 简单来说, 一个进程调用 fork() 函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。...实际上,更准确来说,Linux 的 fork() 使用是通过写时拷贝 (copy- on-write) 实现。写时拷贝是一种可以推迟甚至避免拷贝数据的技术。...其他子进程 cout<<"这是父进程: "<<getpid()<<endl; } } 正确的使用Linux中的用fork()由一个父进程创建同时多个子进程 的格式如下: int...int main(int argc, char* argv[]) { fork(); fork() && fork() || fork(); fork(); } 每fork一次就翻倍

    3.7K41

    linux fork函数浅析

    ,指令指针也全然同样,子进程拥有父进程当前执行到的位置(两进程的程序计数器pc值同样,也就是说,子进程是从fork返回处開始执行的),但有一点不同,假设fork成功,子进程中fork的返回值是0,父进程中...fork的返回值是子进程的进程号,假设fork不成功,父进程会返回错误。...和该进程相关联的所有数据(包含变量,内存空间,缓冲区等等); o. 程序的运行上下文(execution context)。...把将要接替这个进程占用 CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context switch)”,实际的上下文交换须要涉及到很多其它的数据,那和fork...新进程和原有进程的可运行程序是同一个程序;上下文和数据,绝大部分 就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!

    1.3K20

    exec()和元类

    一、exec()的作用 exec执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码, 语法: exec(code,global_dict,local_dict...) code:传入的文本代码 global_dic:传入的字典,接收的是全局名称空间和内置名称空间 local_dict:传入的字典,接收局部名称空间 例子 code = ''' global x x...= 10 y = 20 ''' global_dict = {'x':200} local_dict = {} exec(code,global_dict,local_dict) print(global_dict...) #global_dict返回全局名称空间和内置名称空间 print(local_dict) #local_dict返回局部名称空间 {'x': 10, '__builtins__': {'__name...2.2自定义创建元类 自定义一个类,继承type类,派生出自己的属性和方法 需要使用元类的类通过metaclass指定自定义好的元类。

    73820

    Linux内核14-clone()、fork()和vfork()的区别

    Linux内核用于创建进程的系统调用有3个,它们的实现分别为:fork、vfork、clone。...2. fork() linux将fork实现为这样的clone()系统调用,其flags参数指定为SIGCHLD信号并清除所有clone标志,child_stack参数是当前父进程栈的指针。...vfork最初是因为fork没有实现COW机制,而在很多情况下fork之后会紧接着执行exec,而exec的执行相当于之前的fork复制的空间全部变成了无用功,所以设计了vfork。...总结 clone、vfork和fork是根据不同的需求而开发的。 clone 参数比较多,可以实现的控制就比较多,clone的设计初衷是给pthread线程库的开发提供支持的。...fork就是一个创建完整进程的调用。 clone、vfork和fork在内核层都是调用的_do_fork()这个函数。

    1.8K10

    Linux fork那些隐藏的开销

    和上述create_process比较,fork简直就是一个丑陋的幽灵,不知道如此诡异的东西怎么在50年间被吹捧成了简单的典范,若不是UNIX卫道士们的鼓吹和灌输,fork应该是反面教材才对!...和这个风格相类似的还有类似FD_CLOSEEXEC这种,你说本来就是fork的事,fork啥参数也没有,直接把锅甩给了exec。...fork保留下来是个奇迹,其中多亏了写时复制的功劳。 写时复制无法继续拯救UNIX/Linux fork了。但写时复制本身却真的是伟大的。...显然,create和load相分离的fork+exec方案看起来真的是很灵活,并且 职责明确,父子进程没有任何参数交互,子进程完全对自己负责-- 加载image是子进程自己的事!...对比fork和CLONE_VM clone的时间开销 文章开头我提到, 如果你只是想exec一个新的程序,干嘛不试试clone?

    5K50

    Linux下exec函数族详解

    对于exec函数族来说,它的作用通俗来说就是使另一个可执行程序替换当前的进程,当我们在执行一个进程的过程中,通过exec函数使得另一个可执行程序A的数据段、代码段和堆栈段取代当前进程B的数据段...、代码段和堆栈段,那么当前的进程就开始执行A中的内容,这一过程中不会创建新的进程,而且PID也没有改变。...如果当一个进程想执行另一个可执行程序时,可以使用fork函数先创建一个子进程,然后通过子进程来调用exec函数从而实             现可执行程序的功能。...其中execvpe和execle一般不常用,下面就以例子来看看具体的用法以及所展示出来的效果是怎么样的,便于更好的理解exec函数的作用,先来看一下下面的这个代码: #include ...数组argv和envp(环境变量数组)没有以NULL结尾,此时errno为EFAULT。 3. 没有对应可执行文件的运行权限,此时errno为EACCES。

    8.6K30

    Linux系统编程fork详解

    使用fork函数会创建一个和父进程相同的子进程。...#include        #include        pid_t fork(void);        对于fork函数没有参数,会返回一个..."); exit(1); }        此外还有两个函数可以用来查看当前的进程id和当前进程的父进程的id,分别是getpid()和getppid()...最开始的linux的创建子进程的实现方法是在子进程创建时就直接将父进程的所有内容复制到子进程中,但是这一操作会造成不必要的资源和时间的消耗。所以就有了读时共享,写时复制的机制。...系统会为子进程创建其自己的4G的虚拟内存,而虚拟内存又分为内核内存和用户内存,大小比为1:3。子进程的虚拟地址映射了父进程的虚拟地址所指向的物理内存,所以父子进程实际上共享了同一块物理内存。

    2.3K30
    领券