宿題用に独自のシェルを作成していて、問題が発生しています。
私のシェル プログラムはcat scores | grep 100
コンソールから入力を取得し、期待どおりに出力を出力しますが、grep
コマンドは終了せず、コマンドから無限に実行されていることがわかりますps
。
編集 - fds のクローズ中にエラーが発生しました。現在、grep コマンドは実行されておらず、コンソール出力は -
grep: (標準入力): 不正なファイル記述子
int array fd[][]
最初のプロセスを分岐する前に、コンソールからコマンドの数を読み取り、必要なパイプを作成して 2 次元に格納しています。
fd[0][0]
最初のパイプの読み取り終了が含まれ、最初のパイプfd[0][1]
の書き込み終了が含まれます。fd[1][0]
2 番目のパイプの読み取り終了が含まれ、2 番目のパイプfd[1][1]
の書き込み終了が含まれます。
新しい各プロセスstdin
は、パイプの読み取り側で前のプロセスと複製しstdout
、パイプの書き込み側で次のプロセスと複製します。
以下は私の機能です:
void run_cmds(char **args, int count,int pos)
{
int pid,status;
pid = fork();
if ( pid == 0 )
{
if(pos != 0) dup2(fd[pos-1][0],0); // not changing stdin for 1st process
if(pos != count) dup2(fd[pos][1],1); //not changing stdout for last process
close_fds(pos);
execvp(*args,args);
}
else
{
waitpid(pid,&status,0);
count--;
pos++;
//getting next command and storing it in args
if(count > 0)
run_cmds(args,count,pos);
}
}
}
- argsには、コマンドの引数が含まれます。
- countは、作成する必要があるコマンドの数です。
- posは、入力内のコマンドの位置です
私は問題を理解することができません。これの前に、ハードコードされた値に対して同じアプローチを使用しましたが、機能していました。
/ の理解/実装に欠けているものdup2
とfork
、コマンドが無限に待機しているのはなぜですか?
入力は非常に役立ちます。過去数日間、これに襲われました!
EDIT : close_fds() 関数は以下のとおりです - どのプロセスでも、プロセスをリンクしている両方のパイプを閉じています。
void close_fds(int pos)
{
if ( pos != 0 )
{
close(fd[pos-1][0]);
close(fd[pos-1][1]);
}
if ( pos != count)
{
close(fd[pos][0]);
close(fd[pos][1]);
}
}