关于共享内存的程序代码。 程序执行顺序如下: 1. 首先调用shmget()函数建立一块共享内存 ,大小为1024个字节,该函数返回创建的共享内 存的标识符。 2. 然后调用fork产生一个子进程(生产者进程 )。子进程调用shmat()函数将该共享内存连 接(attach)到自己的虚存空间,即可通过普通 的内存写操作(例如strcpy等),在该共享内存 写入数据。 3. 写完数据后,子进程调用shmdt()函数断开与该 共享内存的连接。 4. 父进程sleep,直到子进程完成上述操作。父进程 (消费者)调用shmctl()函数得到关于这块共享内 存的相关信息,并打印出来。 5. 父进程调用shmat()函数将这块共享内存连接到 自己的虚存空间,即可通过普通的内存读操作(例如 printf等),将该共享内存中的字符串读出来。 6. 读完数据后,父进程调用shmdt()函数断开与该 共享内存的连接。 7. 最后,父进程调用shmctl()函数,销毁该共享 内存。 (二)编写程序 试编写程序,实现父进程和子进程通过共享 内存实现信息的交换。例如:子进程先将子 进程号写入共享内存,父进程将内容读出并 显示。随后,父进程将父进程号写入同一块 共享内存,要求子进程读出并显示。(提示: 系统调用pid_t getpid(void)) Shared Memory Example #include #include #include main(int argc, main(int argc, char **argv) **argv) { char* shared_memory; shared_memory; const int size = 4096; int segment_id = shmget(IPC_PRIVATE, size, S_IRUSR |S_IWUSR); shmget(IPC_PRIVATE, int cpid = fork(); if (cpid == 0) (cpid {//子进程 {//子进程 shared_memory = (char*) shmat(segment_id, NULL, 0); shmat(segment_id, sprintf(shared_memory, sprintf(shared_memory, "Hi from process %d",getpid()); %d",getpid()); } Shared Memory Example else {//父进程 {//父进程 wait(NULL); shared_memory = (char*) shmat(segment_id, NULL, 0); shmat(segment_id, printf("Process printf("Process %d read: %s\n", getpid(), shared_memory); %s\ getpid(), shared_memory); shmdt(shared_memory); shmdt(shared_memory); shmctl(segment_id, shmctl(segment_id, IPC_RMID, NULL); } }