Closed9

minishell

hagewashihagewashi

pipex
主要な関数についてわかりやすく書いている
https://www.haya-programming.com/entry/2018/11/08/185349
http://www.coins.tsukuba.ac.jp/~syspro/2005/No3.html
https://www.coins.tsukuba.ac.jp/~syspro/2019/2019-05-15/index.html#sec:redirection-pipe
パイプの不要な出入り口をクローズする必要があるのはなぜだろうか? 最も大きな理由は,パイプの入口に対応するファイルディスクリプタがすべてクローズされるまで,そのパイプの出口には EOF が送られないからである. EOF が送られない結果,そのパイプの出口からデータを読み出そうとしているプロセスは,読み出し用の関数(getcharなど)からいつまでたってもリターンしないことになる.その結果,プログラムが固まるなどの影響が出る.

man bash によると
パイプ間の入出力接続は指定されたリダイレクション先に実行される.
また、パイプラインの各コマンドは、個別のプロセスとして実行される。

hagewashihagewashi

$> cat | cat | ls
ls の出力が行われ、入力待ちになる。その後エンターを2回押すと終了する。

hagewashihagewashi

pipeコマンド

int pipefd[2];

pipe(pipefd);

pipe[0] = 3
pipe[1] = 4
→作られたパイプ(ファイルディスクリプタ)は現状割り当てられていないfdの中で最小のものを作るとわかった。

hagewashihagewashi

dup2コマンド

int fd;

fd = open(output.file, O_WRONLY);
dup2(fd, 1);
execve("/bin/ls", argv, NULL);

output.fileにls -l の結果が書き込まれた

このスクラップは2023/06/02にクローズされました