Linux -- system、.(source)、exec的区别

这两天在项目中需要一个功能:一个程序启动另外一个程序并且当前的程序退出,所以第一时间使用到了system函数,但是没有起到想要的效果,后来查阅资料,换成了exec函数实现了功能,在这里记录一下相关的知识点,权当做笔记使用。

比如当前执行的程序名称为main,在条件满足的时候需要启动a.out程序,并且退出main程序。

1、main程序由main.c编译而来,且main.c为:

#include 
#include 

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                                                           

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;
}

所以,运行的效果为:

Linux -- system、.(source)、exec的区别_第1张图片

注意终端中的 ctrl + c 的效果,很明显,两个程序都在运行中,效果显然不是需要的。

将main.c中的system改为execv函数

Linux -- system、.(source)、exec的区别_第2张图片

在此运行后的效果为:

Linux -- system、.(source)、exec的区别_第3张图片

由此可以看出,main程序已经退出,并且a.out程序在运行中。

以上只是对两个函数的简单的使用,并没有涉及复杂的东西,见好就收!

一、shell 中的 exec 两种用法:

1、exec 命令:

    代替shell程序,exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。比如 exec ls,终端执行完ls命令后退出。
2、exec 文件重定向:

    可以使用命令 exec ls >> ls.txt 后,可以在当前路径下找到 ls.txt,并且ls.txt文件中的内容即为当前目录下的文件的名称。

Linux -- system、.(source)、exec的区别_第4张图片

Linux -- system、.(source)、exec的区别_第5张图片

 

二、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的返回值影响了原进程。

你可能感兴趣的:(Linux学习,Linux,system,exec,source)