linux中fork, source和exec的区别

 

转:linux中fork, source和exec的区别

shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现的,如awk,sed. source和exec都是内部命令.

fork
   使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child process 结束后, 会返回 parent process,但 parent process 的环境是不会因 child process 的改变而改变的.

source
   使用 source 方式运行 script 时, 就是让 script 在当前 process 内执行, 而不是产生一个 child process 来执行. 由于所有执行结果均于当前 process 内完成,若 script 的环境有所改变, 当然也会改变当前 process 环境了.
source ./my.sh 或 . ./my.sh
 
exec
   使用 exec 方式运行script时, 它和 source 一样, 也是让 script 在当前process内执行, 但是 process 内的原代码剩下部分将被终止. 同样, process 内的环境随script 改变而改变.

结论:通常如果我们执行时,都是默认为fork的。大家可以通过pstree命令看看关于父子进程的关系。如上,如果想让父进程得到子进程的环境变量,就是source方式了

* fork ( /directory/script.sh)
    fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.运行的时候开一个sub-shell执行调用的脚 本,sub-shell执行的时候, parent-shell还在。sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell
* source (source /directory/script.sh)
   与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.
* exec (exec /directory/script.sh)
    exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

exp:

1.sh 
代码: 

 

#!/bin/bash 
A=B 
echo "PID for 1.sh before exec/source/fork: $$" 
export A 
echo "1.sh: \$A is $A" 
case $1 in 
        exec) 
                echo "using exec..." 
                exec ./2.sh ;; 
        source) 
                echo "using source..." 
                . ./2.sh ;; 
        *) 
                echo "using fork by default..." 
                ./2.sh ;; 
esac 
echo "PID for 1.sh after exec/source/fork: $$" 
echo "1.sh: \$A is $A" 

 

2.sh 
代码: 

#!/bin/bash 
echo "PID for 2.sh: $$" 
echo "2.sh get \$A=$A from 1.sh" 
A=C 
export A 
echo "2.sh: \$A is $A" 

然后,分別跑如下参数来观察结果: 
$ ./1.sh fork 
$ ./1.sh source 
$ ./1.sh exec

#fork下主进程(PID:8523)环境变量为改变,并且子进程(PID:8524)执行完毕后回到主进程
[root@localhost ~]# ./1.sh fork
PID for 1.sh before exec/source/fork:8523
1.sh: $A is B
using fork by default...
PID for 2.sh: 8524
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:8523
1.sh: $A is B

#source下进程环境变量改变,1.sh和2.sh的PID均为8530,表明在同一进程下执行
[root@localhost ~]# ./1.sh source
PID for 1.sh before exec/source/fork:8530
1.sh: $A is B
using source...
PID for 2.sh: 8530
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:8530
1.sh: $A is C

#exec下环境变量改变;1.sh和2.sh的PID虽然一样,但是执行2.sh完毕后,并没有回到原进程中继续执行剩余代码;可见主脚本在调用执行exec之后就退出了,余下代码也不会被执行了。
[root@localhost ~]# ./1.sh exec
PID for 1.sh before exec/source/fork:8534
1.sh: $A is B
using exec...
PID for 2.sh: 8534
2.sh get $A=B from 1.sh
2.sh: $A is C

 

 

 

***********************************************************

 学习永远不晚。——高尔基

***********************************************************

 

转载于:https://www.cnblogs.com/chengd/p/7808336.html

vsomeip3 双机通信文件配置 验证环境 vsomeip地址Android运行命令,红色的地方需要配置文件一样Linux运行命令,红色的地方需要配置文件一样Linux service配置文件 ,红色的地方需要更改Android client配置文件,红色的地方需要更改,蓝色的地方可不要 ... 阅读详情

相关推荐

DeepSeek:为文化创意产业注入AI新动能

沪南胜境,闵行新章。随后,2024 年 5 月,DeepSeek 宣布开源第二代 MoE 大模型 DeepSeek-V2,以其比肩 GPT-4Turbo 的卓越性能,以及仅为 GPT-4 百分之一的价格优势,迅速在市场中掀起波澜,收获了 “AI 届拼多多” 的独特名号,让更多人看到了高性价比 AI 大模型的可能性。创作者自身也应提高对创作伦理的认识,树立正确的创作观念,在使用 AI 工具时,保持对创作的主导权,充分发挥自己的创造力想象力,将 AI 作为创作的辅助工具,而不是替代品。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1936

shell中的forksourceexec总结(包括环境变量)

摘要:对forksourceexec三种方式执行shell脚本的总结。   准备知识 1.我们所执行的任何程序,都是由父进程(parent process)所产生出来的一个子进程(child process),子进程在结束后,将返回到父进程去。此一现像在Linux系统中被称为 fork。当子进程被产生的时候,将会从父进程那里获得一定的资源分配、及(更重要的是)继承父进程的环境﹗ 2.Sh...

weixin_34006468的博客 237

C#与欧姆龙PLC 通信——Fins Tcp协议

该调试助手专门为了帮助大家学习以及测试Fins-Tcp通信,下面进行详细介绍。

qq_34059233的博客 2048

shellexecsourcefork 简析

相关概念介绍: 1.内部命令外部命令 bash shell的命令分为两类:外部命令内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。 execsource都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。 2.fork的概念   forklinux的系统调用,用来创建子进程...

sd4493091的博客 880

shell脚本调用另一个脚本的三种不同方法(fork, exec, source)

fork  ( /directory/script.sh)fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。sub-shell执行完毕后返回parent-shell. sub-shell从paren

jin.liu的专栏 1021

Linuxforkexec有什么区别?

调用fork可以创建一个新的进程称为子进程,调用fork函数的进程称为父进程,子进程的所有内容都父进程相同,除了pcd,如果这两个进程都没有对内存做写操作的话,那么两个进程共享调用fork函数的进程的内存页,这样表面上看fork创建进程比exec创建进程快。调用exec创建进程,实际上不是创建进程,更准确的说是加载可执行文件,调用exec后会把exec中指定的可执行文件加载到调用exec的进程的空间内,并把调用exec的进程的内存更新为exec中指定的可执行文件的内容。

oldboyedu1的博客 554

linux fork exec区别,对linuxsourcefork,exec的理解以及case的 使用

fork使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child process 结束后, 会返回 parent process,但 parent process 的环境是不会因 child process 的改变而改变的.source使用 source 方式运行 script ...

weixin_32742673的博客 341

linuxforkexec区别,linux shellforksourceexec区别

execsource都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。bash shell的命令分为两类:外部命令内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。在说明exesource的区...

weixin_32040059的博客 438

linux fork exec区别,linuxfork, sourceexec区别

shell的命令可以分为内部命令外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现的,如awk,sed. sourceexec都是内部命令.fork使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child proces...

weixin_26803527的博客 259

linux中的fork, sourceexec区别

fork    使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child    process 去执行该 script, 当 child process 结束后, 会返回 parent process,    但 parent process 的环境是不会因 child process 的改变而改变的.   source

SHUAI-CSDN 783

linux shellforksourceexec区别

execsource都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。bash shell的命令分为两类:外部命令内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。在说明e...

weixin_34258078的博客 108

linuxforksourceexec区别

【转】http://blog.csdn.net/nash603/archive/2011/01/19/6152200.aspx   execsource都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。 bash shell的命令分为两类:外部命令内部命令。外部命令是通过系统调用或独立的程序实现...

caoruntaogmail的博客 147

linux source bash ./ sh fork exec区别

linux 里做一件事的方法往往有很多种,比如执行一个脚本的就有很多种方式,那么这些方式有什么区别呢? 首先,执行一个shell 脚本的方法有以下几种:source  sh  ./  bash ,那么这些方式有什么区别呢?它们的区别主要是在当前shell环境中运行还是另外开启一个子shell运行以及运行该shell对当前shell环境的影响。 1 source source 是在当前she

touch_future的博客 665

Shellfork/source/exec区别

forklinux的系统调用,用来创建子进程,子进程是父进程的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。环境变量(传给子进程的变量,遗传性是本地变量环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。默认shel...

weixin_34177064的博客 122

shell 脚本实战笔记(1)--source/fork/exec区别

  在linux shell编程中, 随着脚本处理规模的变大, 会嵌套调用子进程. 但父进程以不同的方式调用子进程, 其结果背后的机制不尽相同.这边就简单描述下source/fork/exec调用子进程的区别.编写如下脚本 executor.sh 1 #! /bin/bash 2 3 echo "script:$0, pid: $$" 分别以source/fork/exec...

weixin_33769207的博客 168

*execsourcefork区别*

execsource都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。 bash shell的命令分为两类:外部命令内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。 在说明execs

我的新博客 871

linux 下的 source,sh,./三者区别

linux里,source、sh、bash、./都可以执行shell script文件,那它们有什么不同吗? ----------- 1、source source a.sh 在当前shell内去读取、执行a.sh,而a.sh不需要有"执行权限" source命令可以简写为"." . a.sh 注意:中间是有空格的。 2、sh/bash sh a.sh bash a...

Linux和Eda技术分享 7344

Linuxsource、sh、bash、./有什么区别

Linux系统中,执行Shell脚本的方式有source、sh、bash、以及./等多种,它们之间存在一些差异。下面将以更加通俗易懂的方式解释它们的区别及用法。

q742971636的博客 1855
上一篇: Linux中2>&1使用
下一篇: Linux—shell中$(( ))、$( )、``与${ }的区别
die1643
博客等级 码龄10年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值