Linux进程通信实验(共享内存通信,接上篇)

这一篇记录一下共享内存实验,需要linux的共享内存机制有一定的了解,同时也需要了解POSIX信号量来实现进程间的同步。可以参考以下两篇博客:https://blog.csdn.net/sicofield/article/details/10897091
https://blog.csdn.net/ljianhui/article/details/10253345

实验要求:编写sender和receiver程序,sender创建一个共享内存并等待用户输入,然后把输入通过共享内存发送给receiver并等待,receiver收到后把消息显示在屏幕上并用同样方式向sender发送一个over,然后两个程序结束运行。
这个实验的难点主要在于共享内存的创建和撤销(涉及到的步骤比较多,需要理解各步骤的功能),以及实现两个进程间的相互等待(使用信号量来实现,这里使用了有名信号量)

//sender
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main()
{
    sem_t* sender = sem_open("sender_sem", O_CREAT, 0666, 0);
    sem_t* receiver = sem_open("receiver_sem", O_CREAT, 0666, 0);   

        size_t memsize = 2048;
        key_t thekey = ftok(".",80);
    int memid = shmget(thekey, memsize, IPC_CREAT|0666);
    char* memaddr = shmat(memid, NULL, 0);

    printf("请输入内容: ");

    scanf("%s", memaddr);
    sem_post(sender);

    sem_wait(receiver);
    printf("收到回复: %s\n", memaddr);

    shmdt(memaddr);
    shmctl(memid, IPC_RMID, NULL);

    sem_close(sender);
    sem_close(receiver);

    sem_unlink("sender_sem");
    sem_unlink("receiver_sem");

    return 0;
}
//receiver
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main()
{
    sem_t* sender = sem_open("sender_sem", O_CREAT, 0666, 0);
    sem_t* receiver = sem_open("receiver_sem", O_CREAT, 0666, 0);   

        size_t memsize = 2048;
        key_t thekey = ftok(".",80);
    int memid = shmget(thekey, memsize, IPC_CREAT|0666);
    char* memaddr = shmat(memid, NULL, 0);

    printf("等候信息中...\n");

    sem_wait(sender);
    printf("收到消息: %s\n", memaddr);
        printf("已响应发送方!");
    strcpy(memaddr, "over");
    sem_post(receiver);

    shmdt(memaddr);

    sem_close(sender);
    sem_close(receiver);

    sem_unlink("sender_sem");
    sem_unlink("receiver_sem");

    return 0;
}

实验心得:学习理解了linux的共享内存机制以及POSIX信号量机制。
两个实验虽然加强了对linux一些机制的理解,但是感觉对linux的学习还不够,需要继续学习。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容