美文网首页
Linux进程通信实验(共享内存通信,接上篇)

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

作者: 努力学产品的阿凡 | 来源:发表于2019-03-02 16:28 被阅读0次

    这一篇记录一下共享内存实验,需要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的学习还不够,需要继续学习。

    相关文章

      网友评论

          本文标题:Linux进程通信实验(共享内存通信,接上篇)

          本文链接:https://www.haomeiwen.com/subject/dgtyuqtx.html