2017-09-13 64 views
0

我想寫一個程序,將叉,然後打開一個文件並執行它。它應該執行的文件被稱爲child,並且它已經被編譯。當我輸入./child時,它會運行。但是,當我運行此程序時,它不執行子程序,並提示我輸入「執行失敗」的錯誤消息。我做錯了什麼?無法獲得execvp來執行文件

這是我的父類

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/wait.h> 



int main (int argc, char **argv) 
{ 

pid_t parent = getpid(); 
pid_t pid = fork(); 


if (pid == -1) 
{ 
// error, failed to fork() 
} 
else if (pid > 0) 
{ 
int status; 
waitpid(pid, &status, 0); 
} 
else 
{ 

int var = execvp("./child", NULL); 

if(var < 0) 
{ 
    printf("Execution failed"); 
} 

} 
exit(0); // exec never returns 
} 

這是孩子

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


int main (int argc, char **argv) 
{ 
printf ("Im the child"); 
exit (0); 
} 
+2

1.請仔細閱讀文檔。 2.打印'errno',如果可能'strerror(errno)',它說什麼? 3.你爲什麼認爲'./ child'應該被傳遞給'execvp()'? 3.第二個參數應該是什麼? 4.您是否閱讀過文檔?我不認爲你這樣做,因爲你會知道第二個參數應該是什麼。不要太壞,但請在提問前閱讀文檔。 –

+1

它可以是可以改進的(編譯器對於主...的很多警告),但對我來說代碼起作用。 –

+0

你能想到爲什麼它不適合我的任何原因嗎?子程序從不執行。 – Rubiks

回答

1

其實我不知道你在做什麼錯。複製和編譯(和幾個警告投訴)後,您的代碼運行良好(GCC 7.2)。

很顯然,孩子必須位於運行主可執行文件(分叉的那個)的同一個工作目錄中。

,不過也許我會寫這樣的代碼,但我不是一個專家在分叉:

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <errno.h> 

extern int errno; 

int main() { 
    pid_t pid = fork(); 

    if (pid < 0) { 
    fprintf(stderr, "%s\n", strerror(errno)); 
    return 1; 
    } 

    if (pid == 0) { 
    int ret = execl("./child", "", (char *)NULL); 
    if(ret < 0) { 
    fprintf(stderr, "%s\n", strerror(errno)); 
    return 1; 
    } 
    } else { 
    wait(NULL); 
    } 
    return 0; 
} 

至少它告訴你錯誤execl遇到哪些。