私のプログラムは、forkシステムコールとexecシステムコールを使用する必要があります。 execは、別のコマンドを引数として子プロセスを変更し、そのコマンドを 実行する必要があります。 ./myexecv cat etc/motd
何も起こらを実行していない後これは私の現在のコードフォークとexecveセグメンテーションフォールト
extern char **environ; /* environment info */
main(int argc, char **argv) {
/* argc -- number of arguments */
/* argv -- an array of strings */
char *argvNew[argc + 1];
int pid;
for(int i=0; i<argc; i++){
argvNew[i] = argv[i];
}
argvNew[argc + 1] = NULL;
printf("After For: %s\n",argvNew[0]);
printf("After For: %s\n",argvNew[1]);
printf("After For: %s\n",argvNew[2]);
printf("After For: %s\n",argvNew[3]);
if ((pid = fork()) < 0) {
fprintf(stderr, "Fork error%sstrerror\n", strerror(errno));
exit(1);
}
else if (pid == 0) {
/* child process */
if (execve(argvNew[0], argvNew, environ) < 0) {
fprintf(stderr, "Execve error%d %s\n",errno,strerror(errno));
exit(1);
}
}
else {
/* parent */
wait(0); /* wait for the child to finish */
}
}
が
./myexec cat /etc/motd
であり、たとえば、その日のメッセージを表示します単にprintステートメントだけです。今後のアドバイスはありますか?
引数リストをコピーする必要はありません。 'execv()'ではなく 'execve()'を使用する正式な命令がない限り、それを使用します。 'execv(argv [1]、&argv [1]);' - フォークなし、コピーなし、待機なし、その他はありません。元のコードのfork/exec/waitレジデンスの唯一の限界的な「利益」は、実行されたコマンドが成功するかどうかにかかわらず、親からの戻りコードが常に0であることです(C99以上のコンパイラを使用すると仮定すると、 mainの終了は 'return 0'と同じですが、' main'は明示的な 'int'戻り値の型を持たなければなりません)。 –
あなたの答えをありがとう。しかし、コマンドを書き込んだ後も何も起こりません。 〜/ Documents $ ./myfork ls -l の後:ls の後:-l の後:(null) の後:(null) Execveのエラー2このようなファイルはありません。ディレクトリ – SolRac
ああ...'execv()'または 'execve()'を使って、実行可能ファイルの絶対名(または現在のディレクトリとの相対的な名前)を指定する必要があります。 './myexec/bin/cat/etc/motd'(もしくは' cat/'がある場合は' ./myexec/usr/bin/cat/etc/motd')を試してみてください。それはうまくいくはずです。シェルのようなPATHベースの 'cat'検索を行うには、' execvp() 'を使うか、コードを見つけて本当に望むなら、[' execvpe() '](http:// stackoverflow。 com/questions/7789750)、あなたは環境を変更しないので、環境設定バリアントの使用にはまったく意味がありません。 –