linux system / exec / fork

system的原型:

#include<stdlib.h>

int system(const char *cmdstring);

如果cmdstring是空指针,则仅当命令处理程序可用时,system返回0值。

system("shutdown -s -t 60");//一分钟后关机

system("shutdown -a");//取消关机命令

 

exec函数

fork函数创建新的子进程后,子进程往往要调用一种exec函数(有七种不同的exec函数通常统称为exec函数)以执行另一个程序。

#include<unistd.h>   
 
main()   
 
{   
 
  char *argv[ ]={"ls", "-al", "/etc/passwd", NULL};   
 
  char *envp[ ]={"PATH=/bin", NULL}   
 
  execve("/bin/ls", argv, envp);   
 
} 

运行结果为:-rw-r--r-- 1 root root 1659 Feb 27 20:13 /etc/passwd

这与在bin目录下执行 ls -al /etc/passwd 所得到的结果是一样的

 

 

 

system和exec有什么区别:

去查《unix环境高级编程》可以看到,它是这么写的:system在实现中是调用了fork、exec、waitpid,因此有3种返回值。

当调用一种exec函数(有七种不同的exec函数通常统称为exec函数),该进程执行的程序完全替代为新程序,而新程序则从其main函数开始执行。调用exec并不创建新进程,因此前后的进程ID并未改变。exec只是用磁盘上电一个新程序替换了当前进程正文段,数据段、堆段和栈段。

使用system而不是直接使用fork和exec的优点是system进行了所需的各种出错处理以及各种信号处理。

 

fork()和execve()的区别

exec系列的系统调用是把当前程序替换成要执行的程序,而fork用来产生一个和当前进程一样的进程(虽然通常执行不同的代码流)。通常运行另一个程序,而同时保留原程序运行的方法是,fork+exec。

看看手册里面的例子就知道怎么用了。

exec系列的系统调用已经是变成别的程序了,已经和本程序无关了,执行exec()后,老的进程上下文将被exec出来的新的进程上下文覆盖,新进程代替原进程执行。

 

 

参考:

https://blog.csdn.net/xu215740578/article/details/100905574

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值