Unix网络编程——管道(2)

FIFO:

管道没有名字,最大的劣势在于只能用于由一个共同祖先进程的哥哥进程之间。

FIFO又名又名管道,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO。

FIFO由mkfifo创建。

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

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

其中pathname为使用管道的两个进程都知道的管道文件路径名,mode为该文件的权限位,类似于open的第二个参数。

实际步骤:

  1. 使用mkfifo()函数创建一个管道文件myfifo;
  2. 进程1使用open()打开管道文件myfifo来写后进入休眠;
  3. 进程2使用open()打开管道文件来读后写入新数据,然后退出;
  4. 进程 1读取由进程2写入的数据后退出;
  5. 管道传输完毕,使用unlink()函数删除管道文件myfifo。

转自:http://www.cnblogs.com/0xcafebabe/p/4475904.html的例子:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>

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

#define MAXSIZE 1024
#define PATHNAME "/tmp/myfifo"



int main(int argc, char **argv)
{
    pid_t pid;
    int fd=-1;
    char buffer[MAXSIZE]="";
    
    if(mkfifo(PATHNAME,0644)<0)//在PATHNAME创建一个临时文件
    {
        perror("mkfifo()");
        exit(1);
    }
    
    fflush(NULL);
    pid=fork();//创建第一个子进程
    if(pid<0)
    {
        perror("fork()");
        exit(1);
    }
    if(!pid){
        pid=fork();//创建第二个子进程
        if(pid<0)
        {
            perror("fork()");
            exit(1);
        }
        if(!pid){
            exit(0);//退出父进程,则两个进程变为孤儿进程,由init接管
        }
        
        
        fd=open(PATHNAME,O_RDWR);//先从管道文件中读出数据后再追加写入数据
        if(fd<0)
        {
            perror("open()");
            exit(1);
        }
        read(fd,buffer,MAXSIZE);
        printf("%s",buffer);
        write(fd," world",7);
        close(fd);
        exit(0);
    }
    else
    {
        fd=open(PATHNAME,O_RDWR);//一个进程向管道文件写入后休眠1秒以让另一个进程先读出后自己再读数据,避免死锁
        if(fd<0)
        {
            perror("open()");
            exit(1);
        }
        write(fd,"hello",6);
        sleep(1);
        read(fd,buffer,MAXSIZE);
        close(fd);
        puts(buffer);
        unlink(PATHNAME);
        exit(0);
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/S_Hit/article/details/81192576