2015年9月20日 星期日

[C筆記]系統呼叫exec()

作用:在程式中呼叫其他程式來運作,將目前行程交託給下一個程式,exec()將行程交託後,原程式將不再繼續運作。


sample code:



main.c


#include <unistd.h>//exec()的宣告
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>//errno的宣告

int main(int argc, char* argv[])
{
    char *my_env[] ={"FOOD=coffee",NULL}; //環境變數name=value 並且用NULL告知程式最後項目
    if(execle("./coffee","./coffee","donuts",NULL,my_env)==-1)//如果有找到coffee.exe就會跳去執行coffee.exe 
    {
      fprintf(stderr,"cant run:%s\n",strerror(errno));//strerror(errno)為錯誤訊息種類
      return -1;
                                                              }
                                                         
    return 0;    
    
    }


coffee.c


#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char* argv[])
{
    char *w = getenv("EXTRA");
    if(!w)
       w=getenv("FOOD");   //getenv("FOOD")抓取環境變數的值coffee
    if(!w)
       w = argv[argc -1];
     char *c = getenv("EXTRA");
     if(!c)
      c= argv[argc -1];//讀取argv[1]
      printf("%s with %s\n",c,w);
      
    return 0;
    }
    
    

補充:1

參照execle("./coffee","./coffee","donuts",NULL,my_env)
argc =2         argv[0] ="./coffee"     argv[1]="donuts"


補充:2

exec種類

execl 接受引數串列

execv接受引數陣列

execl p 根據 路徑尋找程式

execl pe 使用環境字串的陣列

補充:3

errno 為錯誤編號 
strerror(錯誤編號)回傳字串告知何種錯誤

補充:4

 if(execle("./coffee","./coffee","donuts",NULL,my_env)==-1)
系統呼叫出問題時通常回傳-1 (但不總是-1)

執行結果