1、AB进程能够随时收发形式 (提示:用多线程,多进程)
//程序1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
char buf1[128]="";
char buf2[128]="";
ssize_t ret;
void *callback1(void *arg)
{
//只写方式打开管道1
int fd1=open("./fifo1",O_WRONLY);
if(fd1<0)
{
perror("open1");
return NULL;
}
//在管道1写入数据
while(1)
{
// printf("请进程1输入:");
fgets(buf1,sizeof(buf1),stdin);
buf1[strlen(buf1)-1]='\0';
ret=write(fd1,buf1,sizeof(buf1));
if(ret<0)
{
perror("write");
return NULL;
}
}
}
void *callback2(void *arg)
{
//打开管道2
int fd2=open("./fifo2",O_RDONLY);
if(fd2<0)
{
perror("open2");
return NULL;
}
//从管道2读取数据
while(1)
{
bzero(buf2,sizeof(buf2));
ret=read(fd2,buf2,sizeof(buf2));
if(ret<0)
{
perror("read");
return NULL;
}
printf("%s\n",buf2);
}
}
int main(int argc, const char *argv[])
{
//创建管道1
umask(0);
if(mkfifo("./fifo1",0777)<0)
{
if(17!=errno)
{
perror("mkfifo1");
return -1;
}
}
//创建管道2
umask(0);
if(mkfifo("./fifo2",0777)<0)
{
if(17!=errno)
{
perror("mkfifo2");
return -1;
}
}
//创建线程1
pthread_t pid1;
if(pthread_create(&pid1,NULL,callback1,NULL)<0)
{
perror("pthread_create1");
return -1;
}
//创建线程2
pthread_t pid2;
if(pthread_create(&pid2,NULL,callback2,NULL)<0)
{
perror("pthread_create2");
return -1;
}
//阻塞
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
return 0;
}
//程序2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
char buf1[128]="";
char buf2[128]="";
ssize_t ret;
void *callback1(void *arg)
{
//只读方式打开管道1
int fd1=open("./fifo1",O_RDONLY);
if(fd1<0)
{
perror("open1");
return NULL;
}
//从管道1读取数据
while(1)
{
bzero(buf1,sizeof(buf1));
ret=read(fd1,buf1,sizeof(buf1));
if(ret<0)
{
perror("read");
return NULL;
}
printf("%s\n",buf1);
}
}
void *callback2(void *arg)
{
//只写打开管道2
int fd2=open("./fifo2",O_WRONLY);
if(fd2<0)
{
perror("open");
return NULL;
}
//从管道2写入数据
while(1)
{
bzero(buf2,sizeof(buf2));
fgets(buf2,sizeof(buf2),stdin);
buf2[strlen(buf2)-1]='\0';
ret=write(fd2,buf2,sizeof(buf2));
if(ret<0)
{
perror("write");
return NULL;
}
}
}
int main(int argc, const char *argv[])
{
//创建管道1
umask(0);
if(mkfifo("./fifo1",0777)<0)
{
if(17!=errno)
{
perror("mkfifo1");
return -1;
}
}
//创建管道2
umask(0);
if(mkfifo("./fifo2",0777)<0)
{
if(17!=errno)
{
perror("mkfifo2");
return -1;
}
}
//创建线程1
pthread_t pid1;
if(pthread_create(&pid1,NULL,callback1,NULL)<0)
{
perror("pthread_create1");
return -1;
}
//创建线程2
pthread_t pid2;
if(pthread_create(&pid2,NULL,callback2,NULL)<0)
{
perror("pthread_create2");
return -1;
}
//阻塞
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
return 0;
}