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