LINUX創建管道文件


兩個進程的通信:1、管道文件;2、select 多路復用;

ps -elf  //查看系統進程

管道,半雙工,一端寫一端讀

創建管道文件

mkfifo 1.pipe



Makefile
a:a.c b.c
          gcc a.c -o a
          gcc b.c -o b
.PHONY:clean
clean:
          rm a b

a.c b.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
int main(int argc,char** argv)
{
        int fdw=open(argv[1],O_WRONLY);
        printf("fdw=%d\n",fdw);
        write(fdw,"hello",5);
        return 0;
}
//如果打開讀端,但是沒有打開對應的寫端,進程會卡住,等待寫端打開

//管道都是要兩端都打開才能正常運行,如果一段打開,一段沒有就會阻塞,等待對方打開
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
int main(int argc,char** argv)
{
        int fdr=open(argv[1],O_RDONLY);
        printf("fdr=%d\n",fdr);
        char buf[10]="";
        read(fdr,buf,sizeof(buf));
        printf("buf=%s\n",buf);
        return 0;
}
//打開順序是先打開寫端,在打開寫讀端



如果管道寫端關閉,讀端如果read,會返回0

改進a.c  //同時打開兩個管道 改進b.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<strings.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char** argv)
{
        int fdw=open(argv[1],O_WRONLY);
        int fdr=open(argv[2],O_RDONLY);
        printf("fdr=%d fdw=%d\n",fdr,fdw);
        char buf[128]="";
        while(1) //如果管道寫端關閉,讀端如果read,會返回0
        {
                bzero(buf,sizeof(buf));
                read(0,buf,sizeof(buf));
                write(fdw,buf,strlen(buf)-1);  //去掉標准輸入最后讀到的回車
                bzero(buf,sizeof(buf));
                read(fdr,buf,sizeof(buf));
                printf("b:%s\n",buf);                      
        }
        return 0;
}
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<strings.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char** argv)
{
        int fdr=open(argv[1],O_RDONLY);
        int fdw=open(argv[2],O_WRONLY);
        printf("fdr=%d fdw=%d\n",fdr,fdw);
        char buf[128]="";
        while(1)
        {
                bzero(buf,sizeof(buf));
                read(fdr,buf,sizeof(buf));
                printf("a:%s\n",buf);
                bzero(buf,sizeof(buf));
                read(0,buf,sizeof(buf));
                write(fdw,buf,strlen(buf)-1);  //去掉標准輸入最后讀到的回車
        }
        return 0;
}


// 只能你讀一句我讀一句 , 不然會卡住




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM