今日任务
1.代码(一次只能发一次消息,不然会存在一些小问题,在接受消息之后会立刻输出上次的第二次发送的消息)
read.c文件(先读取消息)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
//创建打开第一个管道文件
if(-1==mkfifo("./fifo1",0664)){
if(17!=errno){
perror("mkfifo1");
return -1;
}
}
puts("create pipe1 success");
//打开管道文件
int fd1=open("./fifo1",O_RDONLY);
if(-1==fd1){
perror("open1");
return -1;
}
puts("open1 success");
//创建打开第二个管道文件
if(-1==mkfifo("./fifo2",0664)){
if(17!=errno){
perror("mkfifo2");
return -1;
}
}
puts("create pipe2 success");
//打开管道文件
int fd2=open("./fifo2",O_WRONLY);
if(-1==fd2){
perror("open2");
return -1;
}
puts("open2 success");
//读 写
char buf1[128];
char buf2[128];
while(1){
//读
bzero(buf1,sizeof(buf1));
int res=read(fd1,buf1,sizeof(buf1));
if(res<0){
perror("read");
return -1;
}else if(res==0){
break;
}else{
printf("jack:%s\n",buf1);
//fprintf(stdout,"jack:%s\n",buf1);
}
//写
bzero(buf2,sizeof(buf2));
//scanf("%s",buf2);
fgets(buf2,sizeof(buf2),stdin);
buf2[strlen(buf2)-1]='\0';
if(strcmp(buf2,"quit")==0)
break;
if(-1==write(fd2,buf2,sizeof(buf2))){
perror("write");
return -1;
}
}
//关闭
close(fd1);
close(fd2);
return 0;
}
write.c文件(先发送消息的)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
//创建打开第一个管道文件
if(-1==mkfifo("./fifo1",0664)){
if(17!=errno){
perror("mkfifo1");
return -1;
}
}
puts("create pipe1 success");
//打开管道文件
int fd1=open("./fifo1",O_WRONLY);
if(-1==fd1){
perror("open1");
return -1;
}
puts("open1 success");
//创建打开第二个管道文件
if(-1==mkfifo("./fifo2",0664)){
if(17!=errno){
perror("mkfifo2");
return -1;
}
}
puts("create pipe2 success");
//打开管道文件
int fd2=open("./fifo2",O_RDONLY);
if(-1==fd2){
perror("open2");
return -1;
}
puts("open2 success");
char buf1[128];
char buf2[128];
while(1){
//写
bzero(buf1,sizeof(buf1));
//scanf("%s",buf1);
fgets(buf1,sizeof(buf1),stdin);
buf1[strlen(buf1)-1]='\0';
if(strcmp(buf1,"quit")==0)
break;
if(-1==write(fd1,buf1,sizeof(buf1))){
perror("write");
return -1;
}
//读
bzero(buf2,sizeof(buf2));
int res=read(fd2,buf2,sizeof(buf2));
if(res<0){
perror("read");
return -1;
}else if(res==0){
break;
}else{
printf("rose:%s\n",buf2);
//fprintf(stdout,"rose:%s\n",buf2);
}
}
//关闭
close(fd1);
close(fd2);
return 0;
}
运行结果
2.代码(就是把代码1分别放到线程中就可以了,)
jack.c文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
//线程1:读取
void * fun1(void*arg){
//创建打开第一个管道文件
if(-1==mkfifo("./fifo1",0664)){
if(17!=errno){
perror("mkfifo1");
return NULL;
}
}
puts("create pipe1 success");
//打开管道文件
int fd1=open("./fifo1",O_WRONLY);
if(-1==fd1){
perror("open1");
return NULL;
}
puts("open1 success");
char buf1[128];
while(1){
//写
bzero(buf1,sizeof(buf1));
//scanf("%s",buf1);
fgets(buf1,sizeof(buf1),stdin);
buf1[strlen(buf1)-1]='\0';
if(strcmp(buf1,"quit")==0)
break;
if(-1==write(fd1,buf1,sizeof(buf1))){
perror("write");
return NULL;
}
}
close(fd1);
pthread_exit(NULL);
}
//线程2:写出
void * fun2(void*arg){
//创建打开第二个管道文件
if(-1==mkfifo("./fifo2",0664)){
if(17!=errno){
perror("mkfifo2");
return NULL;
}
}
puts("create pipe2 success");
//打开管道文件
int fd2=open("./fifo2",O_RDONLY);
if(-1==fd2){
perror("open2");
return NULL;
}
puts("open2 success");
char buf2[128];
while(1){
//读
bzero(buf2,sizeof(buf2));
int res=read(fd2,buf2,sizeof(buf2));
if(res<0){
perror("read");
return NULL;
}else if(res==0){
break;
}else{
printf("rose:%s\n",buf2);
//fprintf(stdout,"rose:%s\n",buf2);
}
}
close(fd2);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建线程
pthread_t th1,th2;
if(0!=pthread_create(&th1,NULL,fun1,NULL)){
puts("th1 create failed");
return -1;
}
if(0!=pthread_create(&th2,NULL,fun2,NULL)){
puts("th2 create failed");
return -1;
}
pthread_join(th1,NULL);
pthread_join(th2,NULL);
return 0;
}
rose文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
//线程1:写出
void * fun1(void* arg){
//创建打开第一个管道文件
if(-1==mkfifo("./fifo1",0664)){
if(17!=errno){
perror("mkfifo1");
return NULL;
}
}
puts("create pipe1 success");
//打开管道文件
int fd1=open("./fifo1",O_RDONLY);
if(-1==fd1){
perror("open1");
return NULL;
}
puts("open1 success");
char buf1[128];
while(1){
//读
bzero(buf1,sizeof(buf1));
int res=read(fd1,buf1,sizeof(buf1));
if(res<0){
perror("read");
return NULL;
}else if(res==0){
break;
}else{
printf("jack:%s\n",buf1);
//fprintf(stdout,"jack:%s\n",buf1);
}
}
close(fd1);
pthread_exit(NULL);
}
//线程2:读取
void *fun2(void* arg){
//创建打开第二个管道文件
if(-1==mkfifo("./fifo2",0664)){
if(17!=errno){
perror("mkfifo2");
return NULL;
}
}
puts("create pipe2 success");
//打开管道文件
int fd2=open("./fifo2",O_WRONLY);
if(-1==fd2){
perror("open2");
return NULL;
}
puts("open2 success");
char buf2[128];
while(1){
//写
bzero(buf2,sizeof(buf2));
//scanf("%s",buf2);
fgets(buf2,sizeof(buf2),stdin);
buf2[strlen(buf2)-1]='\0';
if(strcmp(buf2,"quit")==0)
break;
if(-1==write(fd2,buf2,sizeof(buf2))){
perror("write");
return NULL;
}
}
close(fd2);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建线程
pthread_t th1,th2;
if(0!=pthread_create(&th1,NULL,fun1,NULL)){
puts("th1 create failed");
return -1;
}
if(0!=pthread_create(&th2,NULL,fun2,NULL)){
puts("th2 create failed");
return -1;
}
pthread_join(th1,NULL);
pthread_join(th2,NULL);
return 0;
}
运行结果
今日思维导图
to be honest,sometime my brain is shutdown .