2014-04-25 122 views
1

我想執行從另一個程序寫的程序(我們稱之爲程序2)。C Linux的 - 如何從另一個程序執行程序

我編譯program2,並有可執行文件調用client

我想運行程序2,併爲此創建了用於嘗試使用exec函數執行程序2的過程fork

程序需要運行兩個參數。

我用:

execvp("client",arguments) 

argumentsNULL封端的char* - 陣列,並且arguments[0]"client"。程序在exec操作中失敗,錯誤No Such File Or Directory

換句話說,如何使用exec函數從另一個程序運行我的代碼?

代碼:

INT主(INT ARGC,CHAR *的argv []){

struct Integrals* shm_ptr; 
key_t key;  
int i,status; 
int shm_id; 
pid_t pid; 
int child_pid[PROCESS]; 
char curPid[10]; 
int curpid; 
double calcSegment[SIZE]; 
int from,to; 
double segment; 

curpid=getpid(); 
sprintf(curPid,"%d",curpid); 

char* arguments[]={"client",argv[1],curPid,NULL}; 

signal(SIGUSR1, sig_handler);//"install" the 'sig_handler' func in case ^C signl. 

printf("---------->%s",arguments[0]); 
key=ftok("\tmp",(char)argv[1][0]); 

if((shm_id=shmget(key,sizeof(Integrals),IPC_CREAT|0600))==-1) 
{ 
    perror("Fail To Allocate Shared Memory"); 
    exit(1); 
} 


if((shm_ptr=(Integrals*)shmat(shm_id,NULL,0))<0) 
{ 
    perror("Fail To Attach Memory"); 
    exit(1); 

} 


pid=fork(); 

if(pid<0) 
{ 
    perror("The Fork Failed"); 
    exit(1);  
} 

else if(pid==0) 
{ 
    if(execvp("workspace/hafala/EX2/client",arguments)==-1) 
    { 
     perror("Faile To Execute 'client.c' Program"); 
     exit(1); 

    } 

} 
+1

在此處發佈您的代碼。 –

+0

爲什麼程序失敗?檢查errno。 – Joni

+0

程序在「沒有這樣的文件或目錄」中失敗 – user2501289

回答

0

嘗試調用的完整路徑,而不是僅僅在EXEC名外部程序。

它看起來像是一個非常簡單的可執行文件重定位問題。

至少我會在那裏檢查。另一種解決方案是將客戶端應用程序移入調用者的同一目錄中以更改當前目錄上下文。

+0

客戶端程序位於相同的目錄中。因爲我使用execvp(「。「,爭吵)現在問題是」權限被拒絕「我試圖做的程序2」chmod + x客戶端「,但仍然相同的權限錯誤 – user2501289

+0

權限被拒絕可能取決於運行您正在開發的進程的用戶不能「讀取」被調用的(客戶端)程序,最後用chmod o + r嘗試一下,或者確保你的用戶是組主人的一部分的擁有者 –

+0

這是我通過運行ls -l:prog獲得的權限:(從她我試圖運行編2):-rwxrwxr-x 1編2:(客戶端)-rwxr-xr-x 1 – user2501289

0

我認爲錯誤是不與您指定

程序相匹配的第一個參數嘗試複印客戶可執行文件在同一目錄和代碼改變了這一點。

char* arguments[]={"./client",argv[1],curPid,NULL}; 

else if(pid==0) 
{ 
    if(execvp("./client",arguments)==-1) 
    { 
     perror("Failed To Execute 'client.c' Program"); 
     exit(1); 
    } 

}