ファイルを使用して通信する1.親と子
子供をforkし、その後、ファイルを開くには、親プロセスと子プロセスはファイルディスクリプタを持っています。ファイル書かれた単語に、親プロセス、およびその後、ファイルディスクリプタを閉じます。そして、第二以降の子は、ファイルの最初の場所に子最初のファイルポインタを目が覚めた後、そのファイルと印刷出力を読み、最後にファイルディスクリプタを閉じます。
イラスト:
結果:
2.三つのサブの親プロセスフォーク処理例
間違い:
結果:
説明:最初の二つのサブプロセスは正常終了しているが、最後の段落は、エラーが発生したサブプロセスであり、システムは、子プロセス11を殺すために子プロセスにシグナルを送ります。したがって、上記の結果。
3. waitpidの機能
注:子プロセスが作成された後であれば、いくつかの他のプロセス操作でグループに送信され、その後、親プロセスと子プロセスは、PID <0に必要なプロセスパラメータの同じセットではありませんが、サブプロセスPIDマイナス記号を追加します。(PIDパラメータは、両方のより一般的に使用される0より大きく、1に等しいです)
例:PIDパラメータは-1、ノンブロッキングです。
説明:子プロセスが続行し、実行中であることを示す、0に等しいWPID。
4. IPCコンセプト
ダクト関連する概念
関数を用いて前記パイプ
戻り値:0成功した場合、失敗すると-1。
例:
結果:
7.血液フォークの位置との間の通信のプロセスを
親と子プロセスが同じパイプラインを使用するようにフォークの位置は、配管後に作成する必要があります。
8.親と子のコミュニケーションの練習のアイデアとの間の一致を使用します
PSのAUXのデフォルトは端末に書かれているので、ファイルディスクリプタのリダイレクトは、ps auxを、パイプ、「書き込み」最後に書き込まれます後私たちは、dup2のを使用する必要があります。同様に、grepをbashのデフォルトは、端末から読み込むので、私たちはファイルディスクリプタのリダイレクト後、grepをbashのパイプラインが読み終わりから「読み取り」になりますので、dup2の使用する必要がありますされています。
内管は、キューを実現しているので、データは一度しか読むことができます。場合は、子プロセスの書き込みデータパイプラインに、子プロセスは、親プロセスが読んで、子供にこれだけの子プロセスの書き込みをパイプの読み出し側を閉じるために、読み込まれた親の読み取りを防止するために、時に親データの読み出し処理は、親プロセスはまた、パイプラインからの書き込みができないようにするために、子も親プロセスが読み取り、唯一の子プロセスの書き込みように、親プロセスにパイプの書き込み側を閉じるために、事情を書きました。
PSの補助を実装9.親と子のコミュニケーションコード| grepをbashの
結果:
注:1. 上面是父进程写,子进程读。如果我们还需要进行父进程读,子进程写的话,那么我们就需要再创建一根管道。
2. 如果写操作的进程不关闭读端,读操作的进程不关闭写端,那么会造成阻塞,grep读不到数据一直在那里等,如下:
10. 兄弟进程间通信
父进程中需要关闭管道的读写两端。子进程1中需要关闭管道的读端,子进程2中需要关闭管道的写端。
例:
执行结果:
11. 管道的读写行为
12. 验证管道缓冲区大小
例:
执行结果:
13. 设置管道的非阻塞属性
上面的三行紫色代码即可完成设置管道的非阻塞属性。
14. fifo的创建
fifo文件大小为0,里面不存数据,数据存在内核的缓冲区里面。只要有fifo文件,就会和内核缓冲区做一个映射,这是操作系统行为。
其中pathname是fifo文件的名字,mode是设置文件权限的参数。最终真正的权限是我们设置的参数再与umask取反的按位与:
15. fifo进行没有血缘关系的进程间通信
先创建fifo文件,名字是myfifo,然后执行a.c的进程和执行b.c的进程之间进行通信:
管道默认有阻塞属性,所以当写进程还没有写数据时,读进程会阻塞在那里等待。当管道中有数据了之后,读进程就开始读。
16. mmap函数参数讲解
(1)mmap函数
注:映射区的大小为4k的整数倍,所以如果参数设置为100字节,会发现映射区大小为4k。
(2)munmap函数
17. 使用mmap读取磁盘文件内容