2016-04-28 4 views
1

私はexec()とfork()で簡単な例を作ろうとしています。しかし、私は少し問題があると私はそれを修正する方法を理解していない。Exec(cdとls)とフォークコールC

コードは3つのフォークを行い、各子では1つのexecを呼び出します。最初のシステムコールは "who"、 "cd"、 "ls -ls"の後です。私の問題は次のとおりです。 "cd"を作成した後、 "ls"呼び出しは現在のディレクトリにファイルを表示しません。ですから、もし私が 'dir1/dir2'を持っていれば、私は "cd"しますが、 "ls"を実行すると、プログラムは 'dir/dir2'にファイルを表示します。

1人の子供が他の子供の変更にアクセスする可能性がありますか?

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

シェル内蔵コマンドであるcdコマンドを実行するのに、execlpを使用することはできません。代わりに、Linux上でchdirを呼び出して、プロセスの現在の作業ディレクトリを変更する必要があります。

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を使用すると、現在のディレクトリをフォークまたは現在の子ディレクトリだけで作成できる将来の子に変更しますか? –

+0

@GabrielaCavalcante fork(2)で作成された子プロセスは、その親の現在の作業ディレクトリを継承します。そう、はい、すべての子供は変更されたものを持っています。 – fluter

1

最初のシステムコールは、 "誰が"

いいえ、それらはシステムコールではないです。 「システムコール」という用語は、まったく異なるものに使用されています。 wholsは、execで実行するプログラムです。一方、cdはシェルコマンドです。 cdを実行しても、正しく行っても効果はありません。 cdはシェルプロセスに、シェルとその子プロセスだけが見ることができる内部状態を変更するように指示するだけです。

execlpのエラーをチェックしないため、残念ながらcdのexecが失敗することはありません。 execの戻り値を確認し、それらのエラーを処理すれば、より明確になるでしょう。

+0

ありがとう:

int chdir(const char *path); 

execlpの戻り値をチェック!先生はそれについてよく説明しなかった、私はこの件についていくつかの本を見つけようとする。 –

関連する問題