您现在的位置是:首页 > 技术文章网站首页技术文章

[C/C++]管道通信

  • WangYe
  • 2020-08-13 11:43:30
  • 717 次阅读
了解C/C++管道通信;

含义

    (1) 管道:管道一般用于两个不同进程之间的通信。当一个进程创建一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样 提供了两个进程之间数据流动的一种方式。

    (2) FIFO:FIFO是一种先进先出的队列。它类似于一个管道,只允许数据的单向流动。每个FIFO都有一个名字,允许不相关的进程访问同一个FIFO。因此也成为命名管。

实现方法

调用pipe()函数创建管道

int pipe(int fd[2]);

fd[0]为管道里的读取端

fd[1]则为管道的写入端。

通过write()函数写入信息

int write (int handle,char *buf,unsigned len)

进程通过read()函数读取信息

int read (int handle,void *buf,unsigned len)

特点

1.管道是一个单向通信信道,如果进程间要进行双向通信,通常需要定义两个管道。

2.管道通过系统调用read(), write()函数进行读写操作。

分类

1.匿名管道:只适用于父子进程之间通信;管道能够把信息从一个进程的地址空间拷贝到另一个进程的地址空间。

2.命名管道:命名管道有自己的名字和访问权限的限制,就像一个文件一样。它可以用于不相关进程间的通信,进程通过使用管道的名字获得管道。


实例

/*PIPE*/
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 80

int main()
{
    int n;
    int fd[2];
    pid_t pid;
    char line[MAXLINE];
    
    if(pipe(fd) < 0)
    {
        perror("pipe");
        exit(1);
    }
    if((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    }
    if(pid > 0)
    {
        close(fd[0]);
        write(fd[1],"Hello World\n",12);
        wait(NULL);
    }else{
        close(fd[1]);
        n = read(fd[0],line,MAXLINE);
        write(STDOUT_FILENO,line,n);
    }
    return 0;
}



文章评论 (0)



Top