Linuxサーバープログラミング——Linuxシステムプログラミングのプロセス通信


プロセス通信はIPCとも呼ばれる
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、デーモンプロセス終了処理