exec()与system()的区别

这应该算是老生长谈的问题了,在此做一个记录。

执行exec()后,老的进程上下文将被exec出来的新的进程上下文覆盖,新进程代替原进程执行。

执行system()后则相当于fork()出一个子进程,并等待此子进程执行完毕。

请看如下程序以加深理解。

  1. /* rt.c */    
  2. int main()  
  3. {  
  4.      return 100;  
  5. }  
/* rt.c */  
int main()
{
     return 100;
}

#gcc rt.c -o rt

  1. /* test.c */  
  2. #include <stdio.h>  
  3. #include <sys/types.h>  
  4. #include <sys/wait.h>  
  5. #include <unistd.h>  
  6. #include <stdlib.h>  
  7.   
  8. int main()  
  9. {  
  10.     char *argv[] = {NULL};  
  11.     char *envp[] = {NULL};  
  12.     int ret_stat = 0;  
  13.     int pid = fork();  
  14.     if (pid == 0) {  
  15.         printf("child: pid %d\n", getpid());  
  16.        //execve("./rt", argv, envp);  
  17.         execve("./rtabc", argv, envp);  
  18.         //system("./rt");  
  19.         exit(127);  
  20.     }  
  21.     else if (pid > 0 ) {  
  22.         printf("parent: child pid is %d\n", pid);  
  23.         if (waitpid(pid, &ret_stat, 0) != pid) {  
  24.             printf("waitpid failed, ret_stat is %d\n", ret_stat);  
  25.         }  
  26.         else {  
  27.             printf("waitpid success, ret_stat is %d\n", ret_stat);  
  28.             printf("WIFEXITED(ret_stat): %d; WEXITSTATUS(ret_stat): %d;", WIFEXITED(ret_stat), WEXITSTATUS(ret_stat));  
  29.         }  
  30.   
  31.   
  32.     }  
  33.     else if (pid < 0) {  
  34.         printf("fork() error !\n");  
  35.         exit(-1);  
  36.     }  
  37.   
  38.   
  39.     return 0;  
  40. }  
/* test.c */
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    char *argv[] = {NULL};
    char *envp[] = {NULL};
    int ret_stat = 0;
    int pid = fork();
    if (pid == 0) {
        printf("child: pid %d\n", getpid());
       //execve("./rt", argv, envp);
        execve("./rtabc", argv, envp);
        //system("./rt");
        exit(127);
    }
    else if (pid > 0 ) {
        printf("parent: child pid is %d\n", pid);
        if (waitpid(pid, &ret_stat, 0) != pid) {
            printf("waitpid failed, ret_stat is %d\n", ret_stat);
        }
        else {
            printf("waitpid success, ret_stat is %d\n", ret_stat);
            printf("WIFEXITED(ret_stat): %d; WEXITSTATUS(ret_stat): %d;", WIFEXITED(ret_stat), WEXITSTATUS(ret_stat));
        }


    }
    else if (pid < 0) {
        printf("fork() error !\n");
        exit(-1);
    }


    return 0;
}

宏WIFEXITED用于判断进程是否正常退出。

宏WEXITSTATUS用于得到进程的退出状态码。


分别使用execve()和system()函数来测试进程的返回值。

问:在列出的3种情况下,进程的返回值分别是什么?

1.使用execve("./rt", argv, envp);

返回值为100,execve()后的exit(127)永远都不会走到。


2.使用execve("./rtabc", argv, envp);

rtabc是一个并不存在的程序。

此时execve()函数将会执行失败。

最后进程返回127。


3.使用system("./rt");

进程返回127。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值