欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux系统编程3:fifo

程序员文章站 2024-03-17 23:23:04
...

用来解决没有血缘关系的进程之间的通信

创建一个有名管道

[[email protected] Linux系统编程]$ mkfifo myfifo
也可以在文件中创建:man 3 mkfifo
 int mkfifo(const char *pathname, mode_t mode);
另一个文件测试:管道存不存在

管道写端:

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
void sys_err(char* str,int exitno){//封装一个打印错误信息的函数
    perror(str);
    exit(exitno);
}
int main(int argc,char* argv[]){//传入管道名
    char buf[1024]="hello world\n";
    int fd;//open返回一个文件描述符

    if(argc<2){
        printf("%s fifoname\n",argv[0]);
        exit(1);
    }

    fd=open(argv[1],O_WRONLY);//写管道
    if(fd<0){
        sys_err("open error",1);
    }

    write(fd,buf,strlen(buf));
    close(fd);
    return 0;
}

~

读端管道

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
void sys_err(char* str,int exitno){//封装一个打印错误信息的函数
    perror(str);
    exit(exitno);
}
int main(int argc,char* argv[]){//传入管道名
    char buf[1024];
    int fd;//open返回一个文件描述符

    if(argc<2){
        printf("%s fifoname\n",argv[0]);
        exit(1);
    }

    fd=open(argv[1],O_RDONLY);//写管道
    if(fd<0){
        sys_err("open error",1);
    }

    int len=read(fd,buf,sizeof(buf));
    write(STDOUT_FILENO,buf,len);
    close(fd);
    return 0;
}
~                                                                                                                                                     
~          
开第一个终端往管道中写入数据
[[email protected] Linux系统编程]$ gcc 10fifowrite.c && ./a.out myfifo
此时处于阻塞状态,因为没有读端

在开一个终端执行读取操作 
[[email protected] Linux系统编程]$ gcc 10fiforead.c && ./a.out myfifo
读写完毕,两个进程都结束   

相关标签: fifo 管道