位置: 编程技术 - 正文

Linux启动新进程的三种方法(linux开机启动进程)

编辑:rootadmin

推荐整理分享Linux启动新进程的三种方法(linux开机启动进程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux系统启动进程命令,linux程序启动,linux程序启动,linux程序启动,linux程序启动,linux中启动进程的命令,linux启动xorg进程,linux启动xorg进程,内容如对您有帮助,希望把文章链接给更多的朋友!

程序中,我们有时需要启动一个新的进程,来完成其他的工作。

下面介绍了三种实现方法,以及这三种方法之间的区别。

1.system函数-调用shell进程,开启新进程

system函数,是通过启动shell进程,然后执行shell命令进程。

原型:

int system(const char *string);

string:shell命令字符串

返回值:成功返回命令退出码,无法启动shell,返回错误码,其他错误,返回-1。

代码示例如下:

process_system.c

输出结果:

system函数,在启动新进程时,必须先启动shell进程,因此使用system函数的效率不高。

2.exec系列函数-替换进程映像

exec系列函数调用时,启动新进程,替换掉当前进程。即程序不会再返回到原进程,

除非exec调用失败。

exec启动的新进程继承了原进程的许多特性,如在原进程中打开的文件描述符在新进程中仍保持打开。

需要注意的是,在原进程中打开的文件流在新进程中将关闭。原因在于,我们在前面讲过进程间通信的方式,进程之间需要管道才能通信。

原型:

path/file:进程命令路径/进程命令名

argc:命令参数列表

envp:新进程的环境变量

代码示例如下:

process_exec.c

输出结果:

可以看出,调用execlp函数后,原进程被新进程替换,原进程中printf("ps done");没有被执行到。

3.fork函数-复制进程映像

1)fork函数的使用

fork和exec的替换不同,调用fork函数,可复制一个和父进程一模一样的子进程。

执行的代码也完全相同,但子进程有自己的数据空间,环境和文件描述符。

原型:

pid_t fork();

父进程执行时,返回子进程的PID

子进程执行时,返回0

Linux启动新进程的三种方法(linux开机启动进程)

代码示例如下:

process_fork.c

输出结果:

调用fork函数后,新建了一个子进程,拷贝父进程的代码,数据等到子进程的内存空间。父进程和子进程执行互不影响。使用fork函数的返回值,来区分执行的是父进程,还是子进程。

2)僵尸进程

子进程退出后,内核会将子进程置为僵尸状态。此时,子进程只保留了最小的一些内核数据结构,如退出码,以便父进程查询子进程的退出状态。这时,子进程就是一个僵尸进程。

在父进程中调用wait或waitpid函数,查询子进程的退出状态,可以避免僵尸进程。

原型:

stat_loc:若不是空指针,则子进程的状态码会被写入该指针指向的位置。

pid:等待的子进程的进程号pid

options:标记阻塞或非阻塞模式

返回值:成功返回子进程的pid,若子进程没有结束或意外终止,返回0

wait:阻塞模式(使用了信号量),父进程调用wait时,会暂停执行,等待子进程的结束。

wait调用返回后,子进程会彻底销毁。

waitpid:与wait不同的是,

a.可以表示四种不同的子进程类型

pid==-1 等待任何一个子进程,此时waitpid的作用与wait相同

  pid >0 等待进程ID与pid值相同的子进程

  pid==0 等待与调用者进程组ID相同的任意子进程

  pid<-1 等待进程组ID与pid绝对值相等的任意子进程

b.当options的值为WNOHANG时,为非阻塞模式,即waitpid会立即返回

此时,可以循环查询子进程的状态,若子进程未结束,waitpid返回,做其他工作。

这样提高了程序的效率。

wait函数使用示例如下:

process_fork3.c

输出结果:

waitpid函数使用示例如下:

process_fork2.c

输出结果:

4.启动新进程三种方法的比较

1)system函数最简单,启动shell进程,并在shell进程中执行新的进程。

效率不高,system函数必须等待子进程返回才能接着执行。

2)exec系列函数用新进程替换掉原进程,但不会返回到原进程,除非调用失败。

该函数继承了许多原进程的特性,效率也较高。

3)fork函数,复制一个子进程,和父进程一模一样,但是拥有自己的内存空间。父子进程执行互不影响。需要注意僵尸子进程的问题。

标签: linux开机启动进程

本文链接地址:https://www.jiuchutong.com/biancheng/376700.html 转载请保留说明!

上一篇:Linux启动新进程的几种方法及比较(linux系统启动进程命令)

下一篇:远程SSH连接服务与基本排错经验总结(使用ssh登录远程服务器有两种方法)

  • 购买旧资产如何入账
  • 买一送一的营销好处
  • 收到电费发票做账摘要怎么写
  • 老板垫付员工工资怎么写条子
  • 月末收到一批b材料,结算凭证未到,估价50000
  • 个人所得税可以抵扣哪些费用
  • 公司房产税如何计算器
  • 固定资产管理的三大原则
  • 扩大税收来源什么意思
  • 办理税务登记与办理法人企业有何区别?
  • 雇主责任险税务处理
  • 收到管理费用的会计科目
  • 信用减值损失借方余额在利润表中
  • 应纳税所得额计算个税
  • 其他权益工具通俗
  • 增值税发票确认时间
  • 本年利润每个月都要结转吗
  • 车辆购置税完税证明电子版二维码怎么扫
  • 收料单的会计分录怎么做
  • 最新企业会计准则
  • 成本核算的原则和要求
  • 2020工会经费退费
  • 会计准则和会计法的关系
  • 公司增资怎么做
  • 一般纳税人存货入账价值
  • 怎么解决windows许可证即将过期
  • group policy client服务未能登录解决方法
  • WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
  • player.exe是什么意思
  • 外地的社保在本地个税扣除
  • win11系统怎么设置密码锁屏
  • 工业企业汽车发生费用处理
  • 成本法转为权益法追溯的理解
  • linux怎么检查网络状态
  • php执行linux命令无效
  • cakephp菜鸟教程
  • 毕业设计烦死了
  • 增值税专用发票和普通发票的区别
  • 上个月发票税率怎么查
  • 网上申报完还需要去税务局吗
  • 残疾人个人所得税减免政策2023
  • 扣除公积金分录
  • 购买商品优惠怎么做账
  • 外资企业是否属于国企
  • 增值税专用发票上注明的价款含税吗
  • sql server中字符串常量只能用双引号括起来
  • 出口货物做免税处理
  • 出口报关成功
  • 施工总包能分包土方吗
  • 预付账款在何时可以转出
  • 上月财务费用多做了,本月怎么调
  • 招待客户住宿属于什么费用
  • 小规模纳税人增值税计算公式
  • 合同资产减值准备对应科目
  • 上月有留抵税额本月怎么申报
  • 进项发票超过期限不认证怎么办
  • 专票取消认证
  • mysql could not be resolved: Name or service not known
  • docker镜像包含什么
  • win7传真和扫描
  • pm是什么软件的缩写
  • win8操作系统如何安装
  • linux定时任务详解
  • The graphics pipeline ,Open GL 渲染管线
  • 安卓游戏模拟游戏制作
  • Bullet(cocos2dx)学习制作桌球游戏之前期准备
  • jqgrid单元格点击事件
  • jquery移动div到另一个div中
  • unity3d模型怎么制作
  • android FileNotFoundException(Is a Directory)解决办法
  • javascript模拟器
  • javascript中的数据类型分为两大类
  • jQuery 3.0 的 setter和getter 模式详解
  • brook javascript框架介绍
  • android局部界面切换
  • python3 split()
  • 国家税务局直属单位招聘
  • 光伏发电要交税不
  • 中国海关化妆品关税
  • 在北京电子税务局怎么缴纳社保费
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设