2016-04-28 120 views
1

我想用exec()和fork()做一個簡單的例子。但我有一個小問題,我不明白如何解決它。Exec(cd和ls)和Fork調用C

該代碼確實有3個分支,並且在每個孩子中它都會調用一個exec。第一個系統調用是「誰」,在「cd」和「ls -ls」之後。我的問題是:在製作「cd」後,「ls」調用不會顯示當前目錄中的文件。所以,如果我有'dir1/dir2',我會做'cd',但是當我做'ls'時,程序顯示'dir/dir2'中的文件。

可能有一個孩子訪問另一個孩子所做的更改嗎?

while (cont_arg < 3) { 
     pid_t pid = fork(); 
     if (pid == -1) { 
      perror("fork failed"); 
      exit(EXIT_FAILURE); 
     } else if (pid == 0) { 
      printf("\n---: child process ID -> %d.\n", getpid()); 
      printf("command --- > %s\n", command[cont_arg]); 
      execlp(command[cont_arg], command[cont_arg], arg[cont_arg], NULL); 
      _exit(EXIT_SUCCESS); 
     } else { 
      wait(&status); 
     } 
     cont_arg++; 
    } 

回答

1

不能使用execlp運行命令cd,這是一個shell內置命令,而不是你應該叫chdir,如果你是在Linux上,要改變你的進程的當前工作目錄。

int chdir(const char *path); 

同時檢查的execlp返回值:

int ret = execlp(command[cont_arg], command[cont_arg], arg[cont_arg], NULL); 
if (ret < 0) { 
    fprintf(stderr, "exec failed for %s\n", command[cont_arg]); 
    exit(EXIT_SUCCESS); // will reach here only if exec failed 
} 
+0

非常感謝!我使用了chdir,它工作。 –

+0

最後一個問題,當我使用chdir時,我會將當前目錄更改爲將來可以使用fork創建的子目錄,或者只更改當前子目錄? –

+0

@GabrielaCavalcante通過fork(2)創建的子進程繼承其父進程的當前工作目錄。所以是的,所有的孩子都會有變化的。 – fluter

1

第一個系統調用是 「誰」

不,這些都不是系統調用。術語「系統調用」用於完全不同的事物。 whols是您使用exec執行的程序。另一方面是cd是一個shell命令。所以執行cd,即使你做得正確也不會有任何效果。由於cd只是告訴shell進程更改其內部狀態,該狀態僅對shell及其子進程可見。

不幸的是,你看不到cd的執行失敗,因爲你不檢查execlp的錯誤。檢查exec的返回值並處理這些錯誤,事情就會開始變得更加清晰。

+0

謝謝!老師們對此沒有很好的解釋,我會試着找一些關於這個問題的書。 –