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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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的学习还不够,需要继续学习。

你可能感兴趣的:(Linux进程通信实验(共享内存通信,接上篇))