linux中fork, source和exec的区别

原文地址http://blog.chinaunix.net/uid-23622436-id-3222317.html

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的区别

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

2.数字芯片时序正确的前提—Max-transition 芯片物理设计中最基本的Max-transition检查 阅读详情

相关推荐

yolov26改进 | 融合改进篇 | 基于 MobileNetV4 双向特征金字塔网络BiFPN的融合改进(全网独家首发)

本文介绍BiFPN与MobileNetV4融合改进的YOLOv26。许多模块单独使用能够涨点,但直接叠加后可能因功能重复、通道不匹配、尺度冲突而掉点,因此融合前必须理解各模块作用。MobileNetV4利用UIB与Mobile MQA构建轻量主干,提升特征提取能力;BiFPN通过可学习权重完成双向多尺度融合,强化大、中、小目标的信息交互。两者优化Backbone与Neck,功能互补、结构冲突较少。本文提供代码、配置、消融对比及Codex修改思路,MobileNetV4也可替换其他主干,便于组合实验与二次创新

Snu77的博客 158

进程创建替换——forkexec

进程控制——forkexec fork fork是UNIX系统中产生新进程的唯一办法 fork的作用是复制当前进程,生成子进程,子进程从fork的位置继续执行。fork函数的特点概括起来就是“调用一次,返回两次”,在父进程中调用一次,在父进程子进程中 各返回一次。fork就像一个叉子,把顺序执行的程序变成了两个分支,并发执行。 fork调用失败返回-1,子进程中for...

漫鱼 9277

【AI大模型:前沿】44、大模型+机器人:从自动化工具到通用智能体的技术革命与应用全景

大模型与机器人的融合催生了“具身智能体”,突破传统机器人智能化缺失、功能单一等瓶颈。大模型赋予机器人三大能力:常识推理(如热牛奶需去包装)、模糊指令解析(如“整理书桌”拆解步骤)、零样本任务泛化(如搭乐高桥)。技术实现上,通过多模态融合(视觉-语言-动作)、仿真训练(虚拟试错)实时反馈(动态调整动作)形成闭环。主流框架如Google RT-2(端到端动作生成)、斯坦福Q-Transformer(强化学习优化)Figure 01(ChatGPT驱动人形机器人)各具优势,可适配工业、家庭等场景。该技术正重塑

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1975

exec函数与fork函数的配合使用

1.实现功能 当父进程检测到输入为1的时候,创建子进程把配置文件的字段值(LENG=1修改为LENG=6)修改掉。代码如下: 将该修改配置文件通过gcc -o 编译生成可执行文件changeData,通过调用fork生成子进程,实现execfork的配合使用,具体代码如下: 配置文件如下: 2.运行结果 可以看出通过fork函数产生子进程再调用exec函数来模拟处理客户端请求,父进程则继续等待下一个服务请求。从代码编译运行调试过程中,不难发现,父子进程是互不干扰的。 ...

qiao代码的木偶人的博客 1004

springboot学习-热部署

1、使用springloaded热部署:下载springloaded->配置Run config->argument->VM argument       问题:修改方法返回值,可以热部署成功。添加新方法,访问失败。 2、使用spring-boot-dev tools。       增加dependency与plugin。修改文件保存后,true会自动重启      如果不能正常使用,请检

zhangbinHn的专栏 400

SpringBoot--热部署--方案

本文介绍SpringBoot的热部署方案。

IT利刃出鞘的博客 4416

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 shell中forksourceexec区别

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 shell中forksourceexec区别

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的博客 664

Shell中fork/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
上一篇: linux shell 管道命令(pipe)使用及与shell重定向区别
下一篇: solr一次性重建所有内容的索引引发的问题及优化方案
giveme38
博客等级 码龄17年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值