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

这两天在项目中需要一个功能:一个程序启动另外一个程序并且当前的程序退出,所以第一时间使用到了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的返回值影响了原进程。

fork-popen和system都是用来创建进程的函数。 fork函数是用于创建一个新的进程,新进程完全复制了父进程的资源。子进程可以通过返回值来区分自己是子进程还是父进程。fork函数相当于同时调用了fork、exec和waitpid这三个系统调用,会等待子进程执行完成后再继续执行。而popen函数则是通过管道来启动一个进程,并返回一个文件指针,可以用来读取或写入子进程的输入输出。popen函数不需要等待子进程执行完成就可以返回。 系统提供的system函数是用于执行shell命令的。它的原型是`int system(const char* command)`,可以通过传入shell命令作为参数来执行命令。system函数会一直等待shell命令执行完成(waitpid),然后返回。而popen函数则可以并行执行shell命令,不需要等待命令执行完成。 在使用popen函数后,需要调用pclose来对所创建的子进程进行回收,否则可能会导致僵尸进程的情况。 总结起来,fork-popen和system都是用来创建进程的函数,但是fork-popen是并行执行的,而system是串行执行的。同时,在使用popen函数后,需要调用pclose进行子进程回收。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux---popen、system函数](https://blog.csdn.net/y6_xiamo/article/details/80156598)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [重新实现popen和system函数](https://download.csdn.net/download/u013105439/10441160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青椒*^_^*凤爪爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值