歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

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

}

運行結果:


Copyright © Linux教程網 All Rights Reserved