ミニシェルのstrtokとexeclp
質問
CでのUnixプロセス管理に慣れるためにミニシェルを作成しています。コマンドラインから情報を読み取り、execlpを介してこれらの引数をシステムに渡します。
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
#define MAXSIZE 100
char prompt[MAXSIZE];
int main(void)
{
pid_t pid;
printf("> ");
// read stuff
if (fgets(prompt, MAXSIZE, stdin) == NULL){
printf("Input validation error!");
abort();
}
// printf("DEBUG: %s" , prompt);
if (strcmp(prompt, "exit")==0) abort();
if ((pid=fork())<0){ // copy process
printf("Process error!");
abort();
}
if (pid==0){ // exec in son-prcess
char *command=(char*)strtok(prompt, " ");
execlp(command, command, 0); // overwrite memory
printf("Error, command not found!");
abort();
} else {
waitpid(pid, 0, 0);
}
}
実際にはこれで終わりますが、 execlp()
からの出力はありません。
誰がその理由を知っていますか?
解決
プログラムを実行しようとしましたが、 command
に \ n
(改行)が含まれていたため失敗しました。 &quot;の代わりに \ n
を追加して変更しました。 &quot; strtok
で、正常に実行されました。
詳細:
if (pid==0){ // exec in son-prcess
char *command=(char*)strtok(prompt, "\n");
printf ("'%s'\n", command);
execlp (command, command, 0); // overwrite memory
printf("Error %d (%s)\n", errno, strerror (errno));
abort();
} else {
テスト実行:
$ ./a.out > ls 'ls' (usual ls behaviour)
他のヒント
Kinopikoは既に動作しない理由を見つけましたが、エラーメッセージが表示されなかった理由は、シェルプロンプトが上書きしているためです。最後に改行を入れてみてください:
printf("Error, command not found!\n");
所属していません StackOverflow