pipe/FIFO IPC

pipe與FIFO功能類似,都是單向通信。管道兩端必須都open以後纔可以通信,否則先open的一端默認阻塞。

pipe作爲無名管道,僅用於近親進程,例如父子進程,同一個進程內的線程等等。

FIFO作爲有名管道,可用於兩個獨立進程的通信。

介紹如下:

http://man7.org/linux/man-pages/man7/pipe.7.html

pipe

http://man7.org/linux/man-pages/man2/pipe.2.html

mkfifo

http://man7.org/linux/man-pages/man1/mkfifo.1.html

dup/dup2

http://man7.org/linux/man-pages/man2/dup.2.html

示例代碼:

#define FIFO_PATH "xxx"

static int      stdinfd_fifo  = -1; 
static int      stdoutfd_fifo = -1; 
int rc = 0;

/* define 2 FIFOs for stdin and stdout, stderr not covered here */
static char IOfifos[2][64]; 

rc = mkdir(FIFO_PATH, 0751);

if((rc != 0) && (errno != EEXIST))
{
    fprintf(stderr, "failed to create dir[%s], errno[%d], error[%s].\n",
        FIFO_PATH, errno, strerror(errno));
	return -1;
}

sprintf(IOfifos[0], "my_process_stdin");
rc = mkfifo(IOfifos[0], 0666);
if((rc != 0) && (errno != EEXIST))
{
    fprintf(stderr, "mkfifo failed for IOfifos[0]\n");
    return -1;
}

sprintf(IOfifos[1], "my_process_stdout");
rc = mkfifo(IOfifos[1], 0666);
if((rc != 0) && (errno != EEXIST))
{
    fprintf(stderr, "mkfifo failed for IOfifos[1]\n");
	return -1;
}

stdinfd_fifo = open(IOfifos[0], O_RDONLY);
if (stdinfd_fifo < 0)
{
	...
}
stdoutfd_fifo = open(IOfifos[1], O_WRONLY);
if (stdoutfd_fifo < 0)
{
	...
}

rc = dup2(stdinfd_fifo, 0);  /* make stdin 0 pointing to FIFO descriptor. */
if (rc != 0)
{
	......
}

rc = close(stdinfd_fifo);
if (rc != 0)
{
    ......
}

rc = dup2(stdoutfd_fifo, 1);  /* make stdout 1 pointing to FIFO descriptor. */
if (rc != 0)
{
	......
}

rc = close(stdoutfd_fifo);
if (rc != 0)
{
    ......
}

注意,close(stdinfd_fifo)和close(stdoutfd_fifo)並不會關閉管道文件,
因爲還有其他文件描述符(0和1)指向管道文件。
https://linux.die.net/man/3/close

When all file descriptors associated with a pipe or FIFO special file are closed,
any data remaining in the pipe or FIFO shall be discarded.

open默認是阻塞的,可以通過設置O_NONBLOCK變爲非阻塞。

 

查看管道容量:

/proc/sys/fs/pipe-max-pages (only in Linux 2.6.34)
              An upper limit, in pages, on the capacity that an unprivileged
              user (one without the CAP_SYS_RESOURCE capability) can set for
              a pipe.

              The default value for this limit is 16 times the default pipe
              capacity (see above); the lower limit is two pages.

              This interface was removed in Linux 2.6.35, in favor of
              /proc/sys/fs/pipe-max-size.

/proc/sys/fs/pipe-max-size (since Linux 2.6.35)
              The maximum size (in bytes) of individual pipes that can be
              set by users without the CAP_SYS_RESOURCE capability.  The
              value assigned to this file may be rounded upward, to reflect
              the value actually employed for a convenient implementation.
              To determine the rounded-up value, display the contents of
              this file after assigning a value to it.

              The default value for this file is 1048576 (1 MiB).  The
              minimum value that can be assigned to this file is the system
              page size.  Attempts to set a limit less than the page size
              cause write(2) to fail with the error EINVAL.

              Since Linux 4.9, the value on this file also acts as a ceiling
              on the default capacity of a new pipe or newly opened FIFO.

/proc/sys/fs/pipe-user-pages-hard (since Linux 4.5)
              The hard limit on the total size (in pages) of all pipes
              created or set by a single unprivileged user (i.e., one with
              neither the CAP_SYS_RESOURCE nor the CAP_SYS_ADMIN
              capability).  So long as the total number of pages allocated
              to pipe buffers for this user is at this limit, attempts to
              create new pipes will be denied, and attempts to increase a
              pipe's capacity will be denied.

              When the value of this limit is zero (which is the default),
              no hard limit is applied.

/proc/sys/fs/pipe-user-pages-soft (since Linux 4.5)
              The soft limit on the total size (in pages) of all pipes
              created or set by a single unprivileged user (i.e., one with
              neither the CAP_SYS_RESOURCE nor the CAP_SYS_ADMIN
              capability).  So long as the total number of pages allocated
              to pipe buffers for this user is at this limit, individual
              pipes created by a user will be limited to one page, and
              attempts to increase a pipe's capacity will be denied.

              When the value of this limit is zero, no soft limit is
              applied.  The default value for this file is 16384, which
              permits creating up to 1024 pipes with the default capacity.

 

參考:

http://man7.org/linux/man-pages/man7/pipe.7.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章