私はシステムコールを使って基本的なbashをしようとしていますが、私はポインタ配列に少し問題があります。Cでこの配列ポインタをクリアするにはどうすればよいですか?
私のコードを再開するには、stdinからread()を使ってバッファにコマンドを読み込んだ後、strsep()を使って引数とすべての引数を配列に分けます。次に、fork()で新しいプロセスを作成し、execvp()で関連する引数でそのコマンドを実行します。
これは、ユーザーが「quit」(まだコード化されていない)と入力するまで無限ループになります。問題は、最初の反復の後に、次のコマンドと引数のために* pArgsが空である必要があることです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv) {
char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr;
int aCount;
pid_t pid;
while(1) {
write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
read(0, bBuffer, BUFSIZ);
sPtr = bBuffer;
aCount = 0;
do {
aPtr = strsep(&sPtr, " ");
pArgs[aCount++] = aPtr;
} while(aPtr);
pArgs[aCount-2][strlen(pArgs[aCount-2])-1] = '\0';
// Debug code to output pArgs content
write(1, "|>", 2);
write(1, pArgs[0], strlen(pArgs[0]));
write(1, "<|", 2);
if(strlen(pArgs[0]) > 1) {
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
if(pid == 0) {
execvp(pArgs[0], pArgs);
exit(0);
}
}
}
return 0;
}
P.S::申し訳ありませんが、私は、現時点では、入力と出力のテストケースを提供することができないと私は
は、ここに私のコードです...どのように行うのか分かりません。うまくいけば、これはあなたがそれを必要としないことを理解し、修正することは難しいことではありません。それはしかし必要なのかどうかはちょうど物事をクリアするために...後でそれを投稿します:
私は、配列をクリアする方法を尋ねたと私はそのための答えを得た知っています。しかし、今私の問題はそうではなく、バッファが収集していたごみがlitbによって指摘されていることは明らかです。ヌル文字で文字列を終了する方が、配列をクリアするよりも意味があります。だから私はlitbの答えを正しいものとしてマークしている。
私の答えが下落した理由を理解できません。明らかに、彼の問題はクリアされないことによって生成されませんポインタの配列ですが、他の場所に問題がありますので、配列をクリアする正しい方法を表示するだけで良いですが、バグを修正する方法を確実に示すことは少なくとも同じくらい重要です! –
彼の "無限ループ"は意図的ですあなたは質問を間違って読んでいますが、私はそれが重要な情報であるので、これをアップウィートしています。 – rlbond
無限ループを壊すつもりはありませんでした。読んで、BUFSIZが255だとしましょう。 "エコーハロー"。 fferには[echo helloblahblusomerandomdata .......]が含まれています。 strsepはどのように健全に動作するはずですか?ポインタ配列をクリアするだけでは行えません。彼が本当に望んだのは、bBuffer配列をクリアすることです。しかし、それは私が答えで言ったように必要ではありません –