IO进程线程-进程间通信(IPC对象)

目录

1.作业一

2.作业二


1.作业一

// 要求实现AB进程对话

// A进程先发送一句话给B进程,B进程接收后打印

// B进程再回复一句话给A进程,A进程接收后打印

// 重复1.2步骤,当收到quit后,要结束AB进程

// 提示:用一个消息队列,两种类型即可

// 当对方输入quit后,退出AB进程删除消息队列;

A.c

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <unistd.h>

struct msgbuf {
    long mtype; /* message type, must be > 0 */
    char mtext[128]; /* message data */
};

// 回调函数,用于接收消息
void* task(void* arg)
{
    // 获取参数
    int msqid = *(int*)arg;
    // 4.定义消息包
    struct msgbuf msg_data;
    // 获取消息
    while (msgrcv(msqid, &msg_data, sizeof(msg_data.mtext), 200, 0)) {
        if (strcasecmp(msg_data.mtext, "quit") == 0) {
            break;
        }
        printf("B: %s\n", msg_data.mtext);
    }
    // 退出进程
    _exit(0);
}

int main(int argc, const char* argv[])
{
    // 1.创建key
    key_t key = ftok("/home/liu", 45);
    if (-1 == key) {
        perror("ftok");
        return -1;
    }
    // 2.创建消息队列
    int msqid = msgget(key, IPC_CREAT | 0664);
    if (-1 == msqid) {
        perror("msgget");
        return -1;
    }

    // 3.创建线程, 用于获取消息
    pthread_t tid;
    if (0 != pthread_create(&tid, NULL, task, &msqid)) {
        printf("pthread_create error\n");
        return -1;
    }
    // 4.标记线程分离
    // pthread_cancel(tid);

    // 5.定义消息包
    struct msgbuf msg_data;
    // 设置消息类型
    msg_data.mtype = 100;
    // 6.向消息队列中发消息
    while (1) {
        // 输入消息数据
        // printf("请输入消息数据:");
        scanf("%s", msg_data.mtext);
        getchar();

        // 发消息
        msgsnd(msqid, &msg_data, sizeof(msg_data.mtext), IPC_NOWAIT);
        // 判断是否退出
        if (strcasecmp(msg_data.mtext, "quit") == 0) {
            break;
        }
    }
    // 删除消息队列
    msgctl(msqid, IPC_RMID, NULL);
    return 0;
}

B.c

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <unistd.h>

struct msgbuf {
    long mtype; /* message type, must be > 0 */
    char mtext[128]; /* message data */
};

// 回调函数,用于接收消息
void* task(void* arg)
{
    // 获取参数
    int msqid = *(int*)arg;
    // 4.定义消息包
    struct msgbuf msg_data;
    // 获取消息
    while (msgrcv(msqid, &msg_data, sizeof(msg_data.mtext), 100, 0)) {
        if (strcasecmp(msg_data.mtext, "quit") == 0) {
            break;
        }
        printf("A: %s\n", msg_data.mtext);
    }
    // 退出进程
    _exit(0);
}

int main(int argc, const char* argv[])
{
    // 1.创建key
    key_t key = ftok("/home/liu", 45);
    if (-1 == key) {
        perror("ftok");
        return -1;
    }
    // 2.创建消息队列
    int msqid = msgget(key, IPC_CREAT | 0664);
    if (-1 == msqid) {
        perror("msgget");
        return -1;
    }

    // 3.创建线程, 用于获取消息
    pthread_t tid;
    if (0 != pthread_create(&tid, NULL, task, &msqid)) {
        printf("pthread_create error\n");
        return -1;
    }
    // 4.标记线程分离
    // pthread_cancel(tid);

    // 5.定义消息包
    struct msgbuf msg_data;
    // 设置消息类型
    msg_data.mtype = 200;
    // 6.向消息队列中发消息
    while (1) {
        // 输入消息数据
        // printf("请输入消息数据:");
        scanf("%s", msg_data.mtext);
        getchar();

        // 发消息
        msgsnd(msqid, &msg_data, sizeof(msg_data.mtext), IPC_NOWAIT);
        // 判断是否退出
        if (strcasecmp(msg_data.mtext, "quit") == 0) {
            break;
        }
    }
    // 删除消息队列
    msgctl(msqid, IPC_RMID, NULL);
    return 0;
}

2.作业二

// 一个进程对共享内存中的数据打印,另一个进程对共享内存中的数据倒置。

// 提示:共享内存中存储:flag+字符串

print.c

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>

int main(int argc, const char* argv[])
{
    // 创建key
    key_t key = ftok("/home", 'k');
    if (-1 == key) {
        perror("ftok");
        return -1;
    }
    // 创建共享内存
    int shmid = shmget(key, 128, IPC_CREAT | 0664);
    if (-1 == shmid) {
        perror("shmget");
        return -1;
    }

    // 映射共享内存
    void* rd_shm = shmat(shmid, NULL, 0);
    if (rd_shm == (void*)-1) {
        perror("shmat");
        return -1;
    }

    while (1) {
        // 读取标识
        if (!*((int*)rd_shm)) {
            printf("%s\n", (char*)rd_shm + 4);
            // 设置标识
            *(int*)rd_shm = 1;
        }
    }

    return 0;
}

inversion.c

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, const char* argv[])
{
    // 创建key
    key_t key = ftok("/home", 'k');
    if (-1 == key) {
        perror("ftok");
        return -1;
    }
    // 创建共享内存
    int shmid = shmget(key, 128, IPC_CREAT | 0664);
    if (-1 == shmid) {
        perror("shmget");
        return -1;
    }

    // 映射共享内存
    void* wt_shm = shmat(shmid, NULL, 0);
    if (wt_shm == (void*)-1) {
        perror("shmat");
        return -1;
    }
    // 输入字符串
    char buf[100] = "";
    printf("input string:");
    scanf("%s", buf);
    // 设置标识
    *(int*)wt_shm = 0;

    char* str = (char*)wt_shm + 4;
    // 向共享内存写入字符串
    strcpy(str, buf);

    int start = 0;
    int end = strlen(buf) - 1;
    while (1) {
        if (*(int*)wt_shm) {
            start = 0;
            end = strlen(buf) - 1;
            // 逆置
            while (start < end) {
                str[start] = str[start] ^ str[end];
                str[end] = str[start] ^ str[end];
                str[start] = str[start] ^ str[end];
                start++;
                end--;
            }
            // 设置标识
            *(int*)wt_shm = 0;
        }
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CG Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值