Linux下系统调用之exec函数族探索

主要通过在一个C程序代码调用另外一个C代码生成的执行文件来说明。

说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是:

  #include <unistd.h>

  extern char **environ;

  int execl(const char *path, const char *arg, ...);

  int execlp(const char *file, const char *arg, ...);

  int execle(const char *path, const char *arg, ..., char *const envp[]);

  int execv(const char *path, char *const argv[]);

  int execvp(const char *file, char *const argv[]);

  int execve(const char *path, char *const argv[], char *const envp[]);

返回值

  如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

    l表示以参数列表的形式调用

  v表示以参数数组的方式调用

  e表示可传递环境变量

  p表示PATH中搜索执行的文件,如果给出的不是绝对路径就会去PATH搜索相应名字的文件,如PATH没有设置,则会默认在/bin,/usr/bin下搜索。

具体示例:

#include <stdio.h>

void main()
 {
     int i;
     if ( fork() == 0 ) 
     {   
        /* 子进程程序 */
//        for ( i = 1; i <10; i ++ ) 
           printf("This is child process\n");
     }   
    else 
    {   
       /* 父进程程序*/
  //     for ( i = 1; i <10; i ++ ) 
       printf("This is parent process\n");

    }   

}

运行结果:




调用上面生成2进制文件:

#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include <errno.h>
//char command[256];
void main()
{
   int rtn; /*子进程的返回数值*/
       /* 从终端读取要执行的命令 */
       printf( ">" );
    //   fgets( command, 256, stdin );
      // command[strlen(command)-1] = 0;
       if ( fork() == 0 ) {/* 子进程执行此命令 */
//          execlp( "test", NULL );
         // execlp( "test", NULL );
       // execlp("ls","-al",NULL);
        execl("/home/buyingfei888/test",NULL);
          /* 如果exec函数返回,表明没有正常执行命令,打印错误信息*/
         // perror( );
          exit( errno );
       }   
       else {/* 父进程, 等待子进程结束,并打印子进程的返回值 */
          wait ( &rtn );
          printf( " child process return %d\n", rtn );
       }

}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值