位置: 编程技术 - 正文

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

编辑:rootadmin

推荐整理分享Linux启动新进程的几种方法及比较(linux系统启动进程命令),希望有所帮助,仅作参考,欢迎阅读内容。

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

有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。

一、system函数调用

system函数的原型为:

它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令的执行情况就如同在shell中执行命令:sh -c string。如果无法启动shell来运行这个命令,system函数返回错误代码;如果是其他错误,则返回-1。否则,system函数将返回该命令的退出码。

注意:system函数调用用一个shell来启动想要执行的程序,所以可以把这个程序放到后台中执行,这里system函数调用会立即返回。

可以先先下面的例子,源文件为new_ps_system.c,代码如下:

该程序调用ps程序打印所有与本用户有关的进程,最后才打印ps Done。运行结果如下:

如果把注释1的语句改为:system("ps au &");则system函数立即返回,不用等待ps进程结束即可执行下面的代码。所以你看到的输出,ps Done可能并不是出现在最后一行,而是在中间。

一般来说,使用system函数不是启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序,即在启动程序之前需要先启动一个shell,而且对shell的环境的依赖也很大,因此使用system函数的效率不高。

二、替换进程映像——使用exec系列函数

exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。但是exec系列函数都有一个共同的工作方式,就是把当前进程替换为一个新进程,也就是说你可以使用exec函数将程序的执行从一个程序切换到另一个程序,在新的程序启动后,原来的程序就不再执行了,新进程由path或file参数指定。exec函数比system函数更有效。

exec系列函数的类型为:

这类函数可以分为两大类,execl、execlp和execle的参数是可变的,以一个空指针结束,而execv、execvp和execve的第二个参数是一个字符串数组,在调用新进程时,argv作为新进程的main函数的参数。而envp可作为新进程的环境变量,传递给新的进程,从而变量它可用的环境变量。

承接上一个例子,如果想用exec系统函数来启动ps进程,则这6个不同的函数的调用语句为:

注:arg0为程序的名字,所以在这个例子中全为ps。

下面我给出一个完整的例子,源文件名为new_ps_exec.c,代码如下:

运行结果如下:

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

细心的话,可以发现,最后的ps Done并没有输出,这是偶然吗?并不是,因为我们并没有再一次返回到程序new_ps_exec.exe上,因为调用execlp函数时,new_ps_exec.exe进程被替换为ps进程,当ps进程结束后,整个程序就结束了,并没有回到原来的new_ps_exec.exe进程上,原本的进程new_ps_exec.exe不会再执行,所以语句printf("ps Done");根本没有机会执行。

注意,一般情况下,exec函数是不会返回的,除非发生错误返回-1,由exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但任何在原进程中已打开的目录流都将在新进程中被关闭。

三、复制进程映像——fork函数

1、fork函数的应用

exec调用用新的进程替换当前执行的进程,而我们也可以用fork来复制一个新的进程,新的进程几乎与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。

fork函数的原型为:

注:在父进程中,fork返回的是新的子进程的PID,子进程中的fork返回的是0,我们可以通过这一点来判断父进程和子进程,如果fork调用失败,它返回-1.

继承上面的例子,下面我给出一个调用ps的例子,源文件名为new_ps_fork.c,代码如下:

输出结果为:

我们可以看到,之前在第二点中没有出现的ps Done是打印出来了,但是顺序却有点不对,这是因为,父进程先于子程序执行,所以先输出了Parent, ps Done,那有没有办法让它在子进程输出完之后再输出,当然有,就是用wait和waitpid函数。注意,一般情况下,父进程与子进程的生命周期是没有关系的,即便父进程退出了,子进程仍然可以正常运行。

2、等待一个进程

wait函数和waitpid函数的原型为:

wait用于在父进程中调用,让父进程暂停执行等待子进程的结束,返回子进程的PID,如果stat_loc不是空指针,状态信息将被写入stat_loc指向的位置。

waitpid等待进程id为pid的子进程的结束(pid为-1,将返回任一子进程的信息),stat_loc参数的作用与wait函数相同,options用于改变waitpid的行为,其中有一个很重要的选项WNOHANG,它的作用是防止waippid调用者的执行挂起。如果子进程没有结束或意外终止,它返回0,否则返回子进程的pid。

改变后的程序保存为源文件new_ps_fork2.c,代码如下:

输出为:

可以看到这次的输出终于正常了,Parent的输出也在子进程的输出之后。

总结——三种启动新进程方法的比较

首先是最简单的system函数,它需要启动新的shell并在新的shell是执行子进程,所以对环境的依赖较大,而且效率也不高。同时system函数要等待子进程的返回才能执行下面的语句。

exec系统函数是用新的进程来替换原先的进程,效率较高,但是它不会返回到原先的进程,也就是说在exec函数后面的所以代码都不会被执行,除非exec调用失败。然而exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但需要注意,任何在原进程中已打开的目录流都将在新进程中被关闭。

fork则是用当前的进程来复制出一个新的进程,新进程与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境变量和文件描述符,我们通常根据fork函数的返回值来确定当前的进程是子进程还是父进程,即它并不像exec那样并不返回,而是返回一个pid_t的值用于判断,我们还可以继续执行fork后面的代码。感觉用fork与exec系列函数就能创建很多需的进程。

标签: linux系统启动进程命令

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

上一篇:Linux进程间通信——使用流套接字

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

  • 税收实体法有哪18种
  • 企业发生的职工培训费应计入产品的制造成本
  • 实收资本在报表中怎么看
  • 普通发票作废要本人去拿吗
  • 增值税纳税申报表附列资料(三)
  • 收到订金如何开票
  • 发票没作废写上作废了怎么办
  • 房地产企业回迁安置房税收规定
  • 存在问题的具体表现和产生问题的原因分析
  • 购入材料用于安装工程
  • 财务杠杆和经营杠杆的区别
  • 过渡性税收优惠是什么意思
  • 跨国避税
  • 去年多摊销的费用今年怎么做账务处理?
  • 养老金余额退休能取吗
  • 合伙企业可以弥补以前年度亏损吗
  • 营改增之后对企业的影响
  • 淘宝企业店铺的钱会打到哪里
  • 增值税普通发票税率
  • 个人营业税是什么意思
  • 其他账簿印花税减免税优惠政策
  • 同一建筑工程签不同合同
  • 国家税务总局2017 11号
  • 事业单位存货包括
  • 工资先发一半
  • 劳务服务公司可以承包大型工程吗?
  • 公司名下汽车过户给个人
  • 联想e430安装win7
  • Win11如何解决界面不断刷新 Win11界面不断刷新解决方法
  • php怎么添加样式
  • 为什么系统弹出登录此网络
  • 开发产品转作经营性资产
  • php后端技术栈
  • 银行卡账户年费是什么意思 为什么扣我银行卡的钱
  • 企业个人借款会计分录
  • 税收返还会计核算
  • 内斯塔特点
  • 马德拉群岛旅游攻略
  • 基于yolov5的目标检测实验任务
  • 页面访问升级出错怎么办
  • 如何用python制作人工智能
  • RLHF:基于人类反馈(Human Feedback)对语言模型进行强化学习【Reinforcement Learning from Human Feedback】
  • centos7搭建http
  • css浮动怎么弄
  • 先款还是先票
  • 一般纳税人补交印花税买卖合同
  • 帝国cms功能
  • 财务报表信息的分类
  • 个人所得税应补退税额怎么查
  • 公司什么项目
  • 销售收入与营业费用的配比不合理
  • 纳税调整调减有哪些
  • 装修专票是几个点
  • 人工费暂估怎么做分录
  • 小规模增值税退税流程怎么操作
  • 一次性开票分期收入账务处理
  • 财务费用报销流程图word
  • 待认证进项税额月末怎么处理
  • 发票可否盖财务章
  • 支付临时工人的报酬属于工资薪金概算吗
  • 公司给客户的礼品太差了还需要给客户吗
  • 未确认融资费用借贷方向
  • 怎么判断政府
  • 公司无形资产可以作为公司注册资金吗
  • ubuntu怎么禁用nouveau
  • 电脑提示Windows照片查看器无法打开此图片
  • windowsxp如何清理磁盘
  • msmpeng.exe是什么进程
  • wind8系统怎么清除所有东西 恢复出厂
  • win10累积更新是什么意思
  • js常用的设计模式
  • javascript的核心语言对象包括
  • jquery的checked
  • android资源文件
  • js parseint parsefloat
  • unity引擎占用内存多少
  • android 进程通信
  • python动态加载py
  • 数据字典实例详解
  • 江苏省增值税专用发票怎么开
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设