Linuxサーバープログラミング——Linuxシステムプログラミングのプロセス通信
7662 ワード
プロセス通信はIPCとも呼ばれる
IPCメソッド
方法:パイプ(最も簡単)
信号(オーバーヘッド最小)
共有マッピング領域/共有メモリ(血縁関係なし)
ローカルソケット(最も安定)
Linuxファイルタイプ:-ファイル
dディレクトリ
lシンボルリンク
sソケットダミーファイル
bブロックデバイス擬似ファイル
c文字デバイス擬似ファイル
pパイプ擬似ファイル
パイプ本
本質は次のとおりです.
1、疑似ファイル、実質的にカーネルバッファ
2、二つのファイルディスクリプタで表し、一つはリードエンドを表し、もう一つはライトエンドを表す
3、データはリードから流入し、ライトから流出する
パイプの原理:カーネルはリングキューメカニズムを使用し、内部とバッファで実現
パイプの限界:1、データは自分で読むことができて自分で書くことができません
2、データが読み出されると、パイプの中に存在せず、繰り返し読み取れない
3、パイプは半二重通信方式を採用するため、データは一方向にしか流れない
4、共通祖先のプロセス間のみパイプを使用する
匿名パイプ
適用:共通の祖先のみのプロセス
有名なパイプ
名前付きパイプは特殊なタイプのファイルです.
名前付きパイプと匿名パイプの違い:
パイプアプリケーションの1つの制限は、親縁関係を持つプロセス間でしか通信できないことです.名前付きパイプは、関連のないプロセス間でデータを交換できます.
共有メモリ
名前付きマッピング領域
匿名マッピング領域
mmap無血縁関係プロセス間通信
しんごう
基本プロパティ
1、簡単
2、大量の情報を持ち込めない
3、ある特定の条件を満たしてから送信する
信号に関連するイベントとステータス
信号を生成:
キー生成
システムコールkill raise abort
ソフトウェア条件タイマalarm
コマンド条件killコマンド
配達:配達および到着
未決:生成と回答の間のステータス
信号処理方式:
1、デフォルト動作を実行する
2、無視(破棄)
3、スナップ(ユーザーが関数を処理する)
信号4要素
1、番号2、名称3、時間4、デフォルト処理動作
man 7 signalを表示するとヘルプが表示されます
せいせいしんごうかんすう
関数プロトタイプ
int abort(void)
IPCメソッド
方法:パイプ(最も簡単)
信号(オーバーヘッド最小)
共有マッピング領域/共有メモリ(血縁関係なし)
ローカルソケット(最も安定)
Linuxファイルタイプ:-ファイル
dディレクトリ
lシンボルリンク
sソケットダミーファイル
bブロックデバイス擬似ファイル
c文字デバイス擬似ファイル
pパイプ擬似ファイル
パイプ本
本質は次のとおりです.
1、疑似ファイル、実質的にカーネルバッファ
2、二つのファイルディスクリプタで表し、一つはリードエンドを表し、もう一つはライトエンドを表す
3、データはリードから流入し、ライトから流出する
パイプの原理:カーネルはリングキューメカニズムを使用し、内部とバッファで実現
パイプの限界:1、データは自分で読むことができて自分で書くことができません
2、データが読み出されると、パイプの中に存在せず、繰り返し読み取れない
3、パイプは半二重通信方式を採用するため、データは一方向にしか流れない
4、共通祖先のプロセス間のみパイプを使用する
匿名パイプ
適用:共通の祖先のみのプロセス
pipe
:
#include
int pipe(int pipefd[2])
pipefd[2]:
、
:0
0
:
: ,read
, ,read 0
,
: , (SIGPIPE )
, , ,
, ( )
: ulimit -a
fpathconf
:
#include
long int fpathconf(int fd,int parameter)
paramter:__PC_PIPE_BUF
#define _GNU_SOURCE
#include
#include
int pipe2(int pipefd[2], int flags)
:
: ,
有名なパイプ
名前付きパイプは特殊なタイプのファイルです.
名前付きパイプと匿名パイプの違い:
パイプアプリケーションの1つの制限は、親縁関係を持つプロセス間でしか通信できないことです.名前付きパイプは、関連のないプロセス間でデータを交換できます.
mkfifo
: FIFO
#include
int mkfifo(const char *filename, mode_t mode)
mode:
: 0
-1
,
共有メモリ
名前付きマッピング領域
mmap
:
:
#include
void* mmap(void *addr, int length , int port , int flag, int fd, off_t offset)
:
addr: , Linux , NULL
length:
port:
PORT_READ
PROT_WRITE
PROT_READ| PROT_WRITE
flags: ( , , )
MAP_SHARED:
MAP_PRIVATE
fd:
offset: 4K
:
MAP_FAILD
munmap
#include
int munmap(void* addr, size_t length)
:
1、 ,
2、 MAP_SHARED, <= 。 MAP_PRIVATE , mmap
3、 , , 。
4、 0 , 。
5、munmap mmap 。
6、 4096
7、mmap , ,
匿名マッピング領域
, , open,unlink,close , 。
int *p = mmap(NULL, 4, PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)
mmap無血縁関係プロセス間通信
しんごう
基本プロパティ
1、簡単
2、大量の情報を持ち込めない
3、ある特定の条件を満たしてから送信する
信号に関連するイベントとステータス
信号を生成:
キー生成
システムコールkill raise abort
ソフトウェア条件タイマalarm
コマンド条件killコマンド
配達:配達および到着
未決:生成と回答の間のステータス
信号処理方式:
1、デフォルト動作を実行する
2、無視(破棄)
3、スナップ(ユーザーが関数を処理する)
信号4要素
1、番号2、名称3、時間4、デフォルト処理動作
man 7 signalを表示するとヘルプが表示されます
せいせいしんごうかんすう
kill /
kill :kill -SIGKILL pid
#include
#include
int kill(pid_t pid, int sig)
:
pid:>0
=0 kill
<0 pid
=-1
raise
:
#include
#include
int raise(int sig)
abort
: SIGABRT
#include
#include
関数プロトタイプ
int abort(void)
软件条件产生信号
alarm : #include
unsigned int alarm(unsigned int seconds) : 0 , alarm(0) , , , setitimer : , us #include int getitimer(int which, struct itimerval *curr_value) int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value) : which: ITIMER_REAL SIGALRM ( ) ITIMER_VIRTUAL SIGVTALRM CPU ( + ) ITIMER_PROF ITIMER_PROF CPU struct itimerval{ struct timeval it_interval; // ,, struct timeval it_value; // , }; struct timeval{ time_t tv_sec; // suseconds_t tv_usec; // };
しんごうセットそうさかんすう
信号セット設定sigset_t set; // typedef unsigned long sigset_t int sigemptyset(sigset_t *set); 0 int sigfillset(sigset_t *set) 1 int sigaddset(sigset* set, int signum) int sigdelset(sigset* set, int signum) int sigismember(const sigset_t* set, int signum) sigprocmask : , , , : : , int sigprocmask(int how, const sigset_t * set, sigset_t *oldset) ;set , ,1 oldset how: mask SIG_BLOCK,set SIG_BLOCK,set SIG_SETMASK, sigpending : int sigpending(sigset_t *set) :set
しんごうスナップsignal #include
typedef void (*sighandler_t)(int) sighandler_t signal(int signum, sighandler_t handler) :SIG_ERR sigaction #include int sigaction(int signum, const struct sigaction * act, struct sigaction *oldact) : struct sigaction{ void (*sa_handler)(int) // void (*sa_sigaction)(int, siginfo_t *, void *) // sg_flags SA_SIGINFO , ( ) sigset_t sa_mask // int sa_flags //0 void (*sa_restorer)(void) // , };
しんごうスナップとくせい
1、ブロックされた信号はキューをサポートせず、複数回発生し、一度だけ記録する.
競合条件pause : , #include
int pause(void) : 1、 , ,pause 2、 , ,pause 3、 , ,pause -1 4、pause ,
しんごうパラメータ
シグナル送信
sigqueue関数はkill関数に対応するが,プロセスが信号を送信すると同時にパラメータを携帯することを指定することができる.sigqueue int sigqueue(pid_t pid, int sig, cinst union sigval value); union sigval{ int sigval_int; void *sival_ptr; };
スナップ関数パラメータsigaction , sa_handler sa_sigaction.
プロセスグループ
プロセスグループアクション関数getpgrp ID pid_t getpgrp(void) getpgid ID pid_t getpgid(pid_t pid) setpgid , int setpgid(pid_t pid, pid_t pgid)
セッション
セッションの作成
セッションの作成には6つのポイントがあります.
1、呼び出しプロセスはプロセスグループのレンタル場ではなく、新しいプロセスは会長になる
2、このプロセスが新しいプロセスグループリーダーになる
3、root権限が必要(Ubuntu不要)
4、新しいセッションは元の制御端末を廃棄し、この返信は制御端末がない
5、この呼び出しプロセスは組長プロセスである
6、セッションを確立する時、fork、親プロセスシード、サブプロセスsetpgidを先に呼び出すgetsid ID pid_t getsid(pid_t pid) srtsid int setsid()
デーモンプロセス
デーモンプロセス/スプライトプロセス:Linuxバックグラウンドサービスプロセス、端末なし、あるタスクを周期的に実行するか、発生した条件の処理を待つ.
デーモンプロセスを作成します.最も重要なのはsetsid関数を呼び出して新しいセッションを作成し、セッションリーダーになることです.
デーモンモデルの作成
1、サブプロセスを作成し、親プロセスが終了し、すべての作業が制御端末から離脱した
2、サブプロセスで新しいセッションを作成する
setsid関数
3、現在のディレクトリをルートディレクトリchdir関数に変更する
アンインストール可能なファイルシステムの使用を防止するか、別のパスに変更できます.
4、ファイル権限マスクのリセット
umask関数
継承されたファイル作成マスクが一部の権限を拒否することを防止し、柔軟性を高める
5、ファイル記述子を閉じる
継承された開いたファイルは使用されず、リソースを浪費し、0,1,2を閉じずにリダイレクト>/dev/null dup 2()
6、デーモンの実行を開始するコア
7、デーモンプロセス終了処理