IO接口 IPC两个文件对话

2023-12-18 19:31:45

实现AB进程对话。
1. A进程发送一-句话后, B进程接收到打印。然后B进程发送一句话,A进程接收后打印
2.重复上述步骤。直到AB接收或者发送完quit后, 结束AB进程

A文件
#include <func.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, const char *argv[])
{
    if(mkfifo("./fifo" ,0664) < 0)
    {
    //  printf("errno= %d\n", errno);
        if(errno != 17)
        {
            perror("mkfifo");
            return -1;
        }
    }
        printf("mkfipo success\n");

    ssize_t dir = 0;
    ssize_t dev = 0;
    char arr[128];
    char brr[128];
    while(1)
    {
        int fp = open("./fifo", O_WRONLY);  
        //写入
        fgets(arr, sizeof(arr), stdin);
        arr[strlen(arr)-1] = '\0';
        dir = write(fp, arr, sizeof(arr));
        if(strcmp(arr, "quit") == 0)
        {
            printf("退出\n");
            break;
        }
        close(fp);
        //接收
       fp = open("./fifo", O_RDONLY);
        dev = read(fp, brr, sizeof(brr));
        if(dev == 0)
        {
            printf("b文件退出\n");
            break;
        }
        printf("wdonly:%s\n", brr);
        close(fp);
    }
    return 0;
}
B文件
#include <func.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, const char *argv[])
{
    if(mkfifo("./fifo" ,0664) < 0)
    {
    //  printf("errno= %d\n", errno);
        if(errno != 17)
        {
            perror("mkfifo");
            return -1;
        }
    }
        printf("mkfipo success\n");

    ssize_t dev = 0;
    ssize_t dir = 0;
    char arr[128];
    char brr[128];
    while(1)
    {
      int fp = open("./fifo", O_RDONLY);
        //接受文件
        dev = read(fp, arr, sizeof(arr));
        if(dev == 0)
        {
            printf("b文件退出\n");
            break;
        }
        printf("wdonly:%s\n", arr);
        close(fp);
        //写入传入b文件
        fp = open("./fifo", O_WRONLY);
        fgets(brr, sizeof(brr), stdin);
        arr[strlen(brr)-1] = '\0';
        dir = write(fp,brr, sizeof(brr));
        if(strcmp(brr, "quit") == 0)
        {
            printf("退出\n");
            break;
        }
        close(fp);
    }
    return 0;
}                                             
现象
1.有三个线程,ID号分别为ABC,且每个线程中都在循环打印自己的ID。要求打印的结果为ABC。
 #include <func.h>
 #include <stdio.h>
 char buf[3] = {'A', 'B', 'C'};
 int  flag = 0;
 pthread_mutex_t mutex;
 pthread_cond_t cond;
 pthread_cond_t cond1;
 pthread_cond_t cond2;
 void * callbakc(void * arg)
 {
     while(1)
     {
         /**********临界资源************/
         //上锁
         pthread_mutex_lock(&mutex);
         if(flag != 0)
         {
             //休眠 解锁 尝试上锁 或者休眠
             pthread_cond_wait(&cond, &mutex);
         }
 
         printf(" %c ", buf[0]);
 
         flag = 1;
         //唤醒
         pthread_cond_signal(&cond1);
         //解锁
         ///**********临界资源************/
         pthread_mutex_unlock(&mutex);
     }
     pthread_exit(NULL);
 }
 void * callbakc1(void * arg)
 {
 
     while(1)
     {
         /**********临界资源************/
         //上锁
         pthread_mutex_lock(&mutex);
         if(flag != 1)                                             
         {
             //休眠 解锁 尝试上锁 或者休眠
             pthread_cond_wait(&cond1, &mutex);
             //若尝试上锁成功, 那就接着运行后面的代码
             //若尝试上锁失败,那就会休眠到cond上面
         }
 
         printf(" %c ", buf[1]);
         flag = 2;
         //换醒
         pthread_cond_signal(&cond2);
         //解锁
         pthread_mutex_unlock(&mutex);
         /*********临界资源********/
     }
 
     pthread_exit(NULL);
 }
 
 void * callbakc2(void * arg)
 {
     while(1)
     {
         /**********临界资源************/
         //上锁
         pthread_mutex_lock(&mutex);
         if(flag != 2)
         {
             //休眠 解锁 尝试上锁 或者休眠
             pthread_cond_wait(&cond2, &mutex);
             //若尝试上锁成功, 那就接着运行后面的代码
             //若尝试上锁失败,那就会休眠到cond上面
         }
         printf(" %c \n", buf[2]);
         flag = 0;
         //换醒
         pthread_cond_signal(&cond);
         //解锁
         pthread_mutex_unlock(&mutex);
         /*********临界资源********/
     }
     pthread_exit(NULL);
 
 
 }
 
 int main(int argc, const char *argv[])
 {
     //创建互斥锁
     pthread_mutex_init(&mutex, NULL);
     //创建条件变量
     pthread_cond_init(&cond, NULL);
     pthread_cond_init(&cond1, NULL);
     pthread_cond_init(&cond2, NULL);
     pthread_t tid;
     pthread_t tid1;
     pthread_t tid2;
     pthread_create(&tid, NULL, callbakc,NULL);
     pthread_create(&tid1, NULL,callbakc1,NULL);
     pthread_create(&tid2, NULL, callbakc2,NULL);
 
     pthread_join(tid, NULL);
     pthread_join(tid1, NULL);
     pthread_join(tid2, NULL);
 
     pthread_mutex_destroy(&mutex);
     return 0;
 }
现象
重点 用多条件变量

文章来源:https://blog.csdn.net/weixin_64965464/article/details/135069134
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。