IO作业:使用函数 使用线程实现,实现能够随时收发,即AB可以 随时 互相收发消息:提示 用多线程 或者多进程
创始人
2024-01-25 08:55:41
0

A中的内容

**************************************************************************************************************

#include
#include
#include
#include
#include
#include
#include
#include
#include
//创建全局变量作为管道
int fd_chd=0;
int fd_far=0;

void * strat_tid(void *arg)
{
    char brr[64]="";//用于管道2
    ssize_t res=0;
    //分支线程用于打印
    while(1)
    {
        //执行读取有名管道2中的内容
        memset(brr,0,sizeof(brr));
        res = read(fd_chd,brr,sizeof(brr));
        if(res<0)
        {
            perror("read");
            return NULL;
        }
        if(strcmp(brr,"quit")==0)
        {
            close(fd_far);
            close(fd_chd);
            exit(0);
        }
        printf("父进程读取长度为 %ld读取到的内容%s\n",strlen(brr),brr);
    }
}
int main(int argc, const char *argv[])
{
    //创建有名管道
    if(mkfifo("./far_talk",0777)<0)
    {
        if(errno!=17)
        {
            perror("mkfifo");
            return -1;
        }
    }
    //创建有名管道
    if(mkfifo("./chd_talk",0777)<0)
    {
        if(errno!=17)
        {
            perror("mkfifo");
            return -1;
        }
    }
    //打开管道1,以写方式打开,阻塞等待读执行
    fd_far=open("./far_talk",O_WRONLY);
    if(fd_far<0)
    {
        perror("open");
        return -1;
    }    
    //打开管道2,以读方式打开,阻塞等待写执行
    fd_chd=open("./chd_talk",O_RDONLY);
    if(fd_chd<0)
    {
        perror("open");
        return -1;
    }
    printf("打开管道完成\n");
    //创建线程
    pthread_t tid;
    if(pthread_create(&tid,NULL,strat_tid,NULL)!=0)
    {
        perror("pthread_create");
        return -1;
    }
    //分离线程
    pthread_detach(tid);
    ssize_t wrs=0;
    char arr[64]="";//用于管道1
    //管道要循环执行的内容
    while(1)
    {
        //先向有名管道中写入
        printf("A中请输入-->");
        if(fgets(arr,sizeof(arr),stdin)<0)     //从终端获取
        {
            perror("fgets");
            return -1;
        }
        arr[strlen(arr)-1]='\0';
        //将获取的内容写入管道1的写中
        wrs =write(fd_far,arr,strlen(arr));                                         
        if(wrs < 0)
        {
            perror("write");
            return -1;
        }
        if(strcmp(arr,"quit")==0)//结束条件
        {
            break;
        }
        printf("写入的大小 %ld,写入了什么 %s\n",strlen(arr),arr);
    }
    pthread_cancel(tid);
    pthread_join(tid,NULL);
            close(fd_far);
            close(fd_chd);
    return 0;
}
**************************************************************************************************************

B中的内容

**************************************************************************************************************

#include
#include
#include
#include
#include
#include
#include
#include
#include
//创建全局变量作为管道
int fd_chd=0;
int fd_far=0;
void * strat_tid(void *arg)
{
    char brr[64]="";//用于管道2
    ssize_t res=0;
    //分支线程用于打印
    while(1)
    {
        //执行读取有名管道fd_far中的内容
        memset(brr,0,sizeof(brr));
        res = read(fd_far,brr,sizeof(brr));
        if(res<0)
        {
            perror("read");
            return NULL;
        }
        printf("父进程读取长度为 %ld读取到的内容%s\n",strlen(brr),brr);
        if(strcmp(brr,"quit")==0)
        {
            close(fd_far);
            close(fd_chd);
            exit(0);
        }
    }
}
int main(int argc, const char *argv[])
{
    //创建有名管道
    if(mkfifo("./far_talk",0777)<0)
    {
        if(errno!=17)
        {
            perror("mkfifo");
            return -1;
        }
    }
    //创建有名管道
    if(mkfifo("./chd_talk",0777)<0)
    {
        if(errno!=17)
        {
            perror("mkfifo");
            return -1;
        }
    }
    //打开管道1,以读方式打开,    
    fd_far=open("./far_talk",O_RDONLY);
    if(fd_far<0)
    {
        perror("open");
        return -1;
    }    
    //打开管道2,以写方式打开,
    fd_chd=open("./chd_talk",O_WRONLY);
    if(fd_chd<0)
    {
        perror("open");
        return -1;
    }
    printf("d打开管道完成\n");
    //创建线程,分支线程中用来读管道fd_far的内容,主线程用来写到管道fd_chd里
    pthread_t tid;
    if(pthread_create(&tid,NULL,strat_tid,NULL)!=0)
    {
        perror("pthread_create");
        return -1;
    }
    //分离线程
    pthread_detach(tid);

    ssize_t wrs=0;
    char arr[64]="";//用于管道1
    //管道要循环执行的内容
    while(1)
    {
        //先向有名管道中写入
        printf("b中请输入-->");
        if(fgets(arr,sizeof(arr),stdin)<0)     //从终端获取
        {
            perror("fgets");
            return -1;
        }
        arr[strlen(arr)-1]='\0';
        //将获取的内容写入管道fd_chd的写中
        wrs =write(fd_chd,arr,strlen(arr));                                         
        if(wrs < 0)
        {
            perror("write");
            return -1;
        }
        if(strcmp(arr,"quit")==0)//结束条件
        {
            return 0;
        }
        printf("写入的大小 %ld,写入了什么 %s\n",strlen(arr),arr);
    }
    pthread_cancel(tid);
    pthread_join(tid,NULL);
            close(fd_far);
            close(fd_chd);

    return 0;
}
 

相关内容

热门资讯

狭窄山路惊现“拦路石” 正要倒...   近日,贵州毕节,狭窄山路惊现“拦路石”,正要倒车避让对向车结果垮塌,网友:是你的善良救了你。(编...
最新报告!179人遇难!韩国空...   据环球网援引韩国《朝鲜日报》21日报道,韩国国土交通部下属航空与铁路事故调查委员会(ARAIB)...
11.23亿!你是其中之一   新华社权威快报|我国网民规模达11.23亿人  海报制作:胡戈  中国互联网络信息中心7月21日...
国家航天局:商业航天项目承担方...   中新网7月21日电 据国家航天局网站消息,7月21日,国家航天局发布《关于加强商业航天项目质量监...
(辉煌60载 魅力新西藏)一个...   中新网西藏那曲7月20日电(记者 程小路)今年5月,西藏那曲市比如县白嘎乡的冬虫夏草(以下简称“...
焦点访谈丨全国多地进入“烧烤”...   7月20日,我国正式进入了今年的三伏天。对于高温,最近这些天我国部分地方已经开启“烧烤”模式,很...
​未来5年,会计行业最值得考的... 未来5年,会计行业最值得考的证书是哪些注册会计师(CPA)CPA是国内会计行业的“天花板”,含金量极...
AI再现“海丝”盛景|数智丝路...   六百多年前  七下西洋的郑和  不仅带回百种海外奇珍异宝  同时也将中国的“四书五经”  “四大...
互动实验、展品体验、趣味科普…...   央视网消息:每到暑期,科技馆是孩子们最爱打卡的地方之一,不仅好玩而且还能学到各类科学知识,亲身感...
【光明论坛】培育创新生态,增强...   【光明论坛】  作者:陈强(同济大学经济与管理学院教授)  近日召开的中央城市工作会议指出,着力...