2024.1.8 IO线程进程 作业

思维导图

2024.1.8 IO线程进程 作业_第1张图片2024.1.8 IO线程进程 作业_第2张图片

练习题

1.使用有名管道完成两个进程之间相互通信

user1.c

#include 
#define FIFO1 "./myfifo"
#define FIFO2 "./myfifo2"
//收取信息
void *task1(void *arg)
{
    //创建fifo管道文件
    mkfifo(FIFO2,0664);
    //只读方式打开管道文件
    int rfd = open(FIFO2, O_RDONLY);
    if (rfd == -1)
    {
        perror("myfifo open error\n");
        return NULL;
    }

    char buf[128] = "";
    //将管道文件中的内容读出,并输出到终端上
    while (1)
    {
        //清空buf多余字符
        memset(buf, 0, sizeof(buf));
        int res = read(rfd, buf, sizeof(buf));
        printf("%s\n", buf);
        //接收到quit信号退出
        if (strcmp(buf, "quit") == 0)
        {
            break;
        }
    }
    close(rfd);
}
//发送信息
void *task2(void *arg)
{
    //只写打开管道文件
    int wfd = open(FIFO1, O_WRONLY);
    if (wfd == -1)
    {
        perror("myfifo open error\n");
        return NULL;
    }

    char buf[128] = "";
    //将终端输入内容写入buf
    while (1)
    {
        //清空buf多余字符
        memset(buf, 0, sizeof(buf));

        int res = read(0, buf, sizeof(buf));
        buf[strlen(buf) - 1] = '\0';
        write(wfd, buf, sizeof(buf));

        //输入quit发送退出信号
        if (strcmp(buf, "quit") == 0)
        {
            break;
        }
    }

    close(wfd);
}
int main(int argc, char const *argv[])
{
    //创建两个线程,tid1负责收取信息,tid2负责发送信息
    pthread_t tid1, tid2;
    if (pthread_create(&tid1, NULL, task1, NULL) == -1)
    {
        printf("tid1 create error\n");
        return -1;
    }
    if (pthread_create(&tid2, NULL, task2, NULL) == -1)
    {
        printf("tid2 create error\n");
        return -1;
    }
    //回收线程资源
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    unlink(FIFO2);
    return 0;
}

user2.c

#include 
#define FIFO1 "./myfifo"
#define FIFO2 "./myfifo2"
//收取信息
void *task1(void *arg)
{
    //创建fifo管道文件
    mkfifo(FIFO1,0664);
    //只读方式打开管道文件
    int rfd = open(FIFO1, O_RDONLY);
    if (rfd == -1)
    {
        perror("myfifo open error\n");
        return NULL;
    }

    char buf[128] = "";
    //将管道文件中的内容读出,并输出到终端上
    while (1)
    {
        //清空buf多余字符
        memset(buf, 0, sizeof(buf));
        int res = read(rfd, buf, sizeof(buf));
        printf("%s\n", buf);
        //接收到quit信号退出
        if (strcmp(buf, "quit") == 0)
        {
            break;
        }
    }
    close(rfd);
}
//发送信息
void *task2(void *arg)
{
    //只写打开管道文件
    int wfd = open(FIFO2, O_WRONLY);
    if (wfd == -1)
    {
        perror("myfifo open error\n");
        return NULL;
    }

    char buf[128] = "";
    //将终端输入内容写入buf
    while (1)
    {
        //清空buf多余字符
        memset(buf, 0, sizeof(buf));

        int res = read(0, buf, sizeof(buf));
        buf[strlen(buf) - 1] = '\0';
        write(wfd, buf, sizeof(buf));

        //输入quit发送退出信号
        if (strcmp(buf, "quit") == 0)
        {
            break;
        }
    }

    close(wfd);
}
int main(int argc, char const *argv[])
{
    //创建两个线程,tid1负责收取信息,tid2负责发送信息
    pthread_t tid1, tid2;
    if (pthread_create(&tid1, NULL, task1, NULL) == -1)
    {
        printf("tid1 create error\n");
        return -1;
    }
    if (pthread_create(&tid2, NULL, task2, NULL) == -1)
    {
        printf("tid2 create error\n");
        return -1;
    }
    //回收线程资源
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    unlink(FIFO1);
    return 0;
}

2024.1.8 IO线程进程 作业_第3张图片

你可能感兴趣的:(microsoft)