兩個進程的通信: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;
}
|
//
只能你讀一句我讀一句
,
不然會卡住