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