[解決済み] execvp() が私のシェルで動作しない
2022-02-25 09:32:02
質問
私は小さなシェルを作ろうとしています。私の問題は、私が呼び出すときに
execvp()
- エラーが出ます。
例えば、私が
ls -l
を返します。
ls: invalid option -- '
なぜこのようなエラーが発生するのか、どなたか教えていただけませんか?私のコードでは、関数コマンドスプリットは、ユーザーの入力を取得し、それらを別々のコマンドに分割します。分割されたコマンドは、次のように区切られます。
;
文字を使用します。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#define MAX_CHARACTERS 512
#define HISTORY_SIZE 10
int commandSplit(char *c, char *a[], int t[]) {
int count = 0;
int total = 0;
char *temp[MAX_CHARACTERS];
char *readCommands = strtok(c, ";");
while(readCommands != NULL) {
printf("Reading full command: %s\n", readCommands);
temp[count] = readCommands;
count++;
readCommands = strtok(NULL, ";");
}
printf("Done reading full commands\n");
for(int i = 0; i < count; i++) {
char *read = strtok(temp[i], " ");
int track = 0;
while(read != NULL) {
printf("Reading individual command: %s\n", read);
a[total] = read;
track++;
total++;
read = strtok(NULL, " ");
}
t[i] = track;
}
return count;
}
int main() {
int exitProgram = 0;
char *args[MAX_CHARACTERS];
while(!exitProgram) {
char *commands = (char *)(malloc(MAX_CHARACTERS*sizeof(char)));
int tracker[MAX_CHARACTERS];
int numOfCommands = 0;
printf("tinyshell> ");
fgets(commands, MAX_CHARACTERS, stdin);
if(strlen(commands) == 0) continue;
numOfCommands = commandSplit(commands, args, tracker);
printf("There are %i commands!\n", numOfCommands);
if(strcmp(args[0], "exit") == 0) {
printf("Exiting\n");
exitProgram = 1;
continue;
}
int l = 0;
for(int i = 0; i < numOfCommands; i++) {
int status;
char *holder[tracker[i]+1];
for(int j = 0; j < tracker[i]; j++) {
holder[j] = args[l];
printf("Assiging holder:%s\n", holder[j]);
l++;
}
holder[tracker[i]] = NULL;
printf("What is holder? \n");
for(int o = 0; o < tracker[i]; o++) printf("%s", holder[o]);
pid_t p = fork();
pid_t waiting;
if(p == 0) {
printf("I am in child process\n");
execvp(holder[0], holder);
fprintf(stderr, "Child process could not execvp!\n");
exit(1);
}
else {
if(p < 0) {
fprintf(stderr, "Fork FAILED!\n");
}
else {
waiting = wait(&status);
printf("Child %d, status %d\n", waiting, status);
}
}
for(int i = 0; i < numOfCommands; i++) {
args[i] = NULL;
}
}
}
return 0;
}
解決方法は?
あなたの問題は、以下の通りです。
fgets()
は改行文字も読み取ります。
. その結果、最後の引数である
execvp()
引数配列に改行が含まれるため
ls
は、認識できない引数であることを訴えます。
ls
は
-l\n
渡す必要があるのは、単に
-l
を改行しないでください。
の後に、このコードを追加してみてください。
fgets
の呼び出しで、入力バッファをトリミングします。
int len;
len = strlen(commands);
if (len > 0 && commands[len-1] == '\n') {
commands[len-1] = '\0';
}
関連
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] ディレクトリが存在しない場合のみmkdirする方法は?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] シェルスクリプトでYYYY-MM-DD形式の日付にする
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] シェルコマンドの実行と出力のキャプチャ
-
[解決済み] 整数の合計を1行に1つずつ表示するシェルコマンド?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み】execvp: バッドアドレスエラー