1. 程式人生 > >進程間通訊

進程間通訊

實現 固定 value turn 寫入 ppr 創建 似的 -1

進程間通訊(Inter process communication :IPC)

1》6種進程間通訊:

  4種數據共享機制:包括管道(分為無名管道和有名管道),消息隊列、共享內存、UNIX域套接字(socket);

  1種實現異步機制:信號;

  1種實現互斥和同步:信號量;

  

  ①、管道(pipe)

    管道是一種特殊的文件;

    管道是文件:可對它使用文件IO的讀寫函數;

    特殊的:管道是由內核實現的,在內存中文件,它不能使用類似fseek、lseek()的對文件指針的操作;管道是單向的(半雙工);

      (1)、無名管道(unnamed pipe):它是用於具有親緣關系(父子、兄弟進程)的進程間通訊;

              #include <unistd.h>

              int pipe(int pipefd[2]);

          pipefd[0]:固定為讀端,pipe[1]:固定為寫端;

          RETURN VALUE:On success, zero is returned. On error, -1 is returned, and errno is set appropriately.

          只有在管道的讀端存在時,向管道中寫入數據才有意義。否則,向管道中寫入數據的進程將收到內核傳來的SIGPIPE信號(通常Broken pipe錯誤)。

      (2)、有名管道:通過特殊的管道文件進行操作,管道文件通過mkfifo創建,它也是內存中的文件,不能用lseek()類似的函數,但可以用一般的文件IO操作函數(open()、read()、write()等)。        

              #include <sys/types.h>
              #include <sys/stat.h>

              int mkfifo(const char *pathname, mode_t mode);

          RETURN VALUE:On success mkfifo() returns 0. In the case of an error, -1 is returned (in which case, errno is set appro‐priately).

        註意:最終創建的管道文件的訪問權限為:mode & ~ mask;       

              #include <unistd.h>

              int access(const char *pathname, int mode);

        pathname:文件路徑;

        mode:F_OK://判斷文件是否存在;  

            R_OK、W_OK、X_OK://判斷對文件是否具有讀、寫、可執行權限(文件必須存在);

    ②、信號:

    ③、共享內存和信號量:

進程間通訊