这两天在项目中需要一个功能:一个程序启动另外一个程序并且当前的程序退出,所以第一时间使用到了system函数,但是没有起到想要的效果,后来查阅资料,换成了exec函数实现了功能,在这里记录一下相关的知识点,权当做笔记使用。
比如当前执行的程序名称为main,在条件满足的时候需要启动a.out程序,并且退出main程序。
1、main程序由main.c编译而来,且main.c为:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int ret = 0, cnt = 0;
printf("Hi,I am main\r\n");
while(1)
{
cnt += 1;
printf("I am main, and cnt = %d\r\n", cnt);
if(cnt % 5 == 0)
{
ret = system("./a.out");
printf("I am main, and ret = %d\r\n", ret);
}
usleep(800000);
}
return 0;
}
2、a.out程序由a.c编译而来,且a.c为:
#include <stdio.h>
int main(int argc, const char **argv)
{
int cnt = 0;
while(1)
{
cnt += 1;
printf("I am a.out, cnt = %d\r\n", cnt);
sleep(1);
}
return 1;
}
所以,运行的效果为:
注意终端中的 ctrl + c 的效果,很明显,两个程序都在运行中,效果显然不是需要的。
将main.c中的system改为execv函数
在此运行后的效果为:
由此可以看出,main程序已经退出,并且a.out程序在运行中。
以上只是对两个函数的简单的使用,并没有涉及复杂的东西,见好就收!
一、shell 中的 exec 两种用法:
1、exec 命令:
代替shell程序,exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。比如 exec ls,终端执行完ls命令后退出。
2、exec 文件重定向:
可以使用命令 exec ls >> ls.txt 后,可以在当前路径下找到 ls.txt,并且ls.txt文件中的内容即为当前目录下的文件的名称。
二、exec与.(source)的异同:
1、exec和.(source)都可以在终端来执行程序或者脚本
2、exec执行时候会关闭当前shell进程,并且fork一个相同pid的shell进程来执行,系统调用新的exec的process来替代原来的进程执行。没有新的进程创建,原来进程的代码段、数据段、堆栈都被新的process所代替。
3、.(source)执行的时候是当前shell环境下执行,执行完成后把状态返回给当前的shell。
三,system与exec的区别
1、system()和exec()都可以执行进程外的命令,system是在原进程上开辟了一个新的进程,但是exec是用新进程(命令)覆盖了原有的进程。
2、system()和exec()都有能产生返回值,system的返回值并不影响原有进程,但是exec的返回值影响了原进程。