本文主要是介绍IPC-shm 共享内存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
a series of functions
int shmget(key_t key, size_t size, int shmflg);
//两个进程若想共用一个物理内存区,只需在此处填写相同的key_t
//返回共享内存标示符,作为shmat的参数shmidvoid *shmat(int shmid, const void *shmaddr, int shmflg);
//返回虚拟内存首地址
//若参数shmaddr为空,让系统选择映射首地址int shmdt(const void *shmaddr);int shmctl(int shmid, int cmd, struct shmid_ds *buf);struct shmid_ds {struct ipc_perm shm_perm; /* Ownership and permissions */size_t shm_segsz; /* Size of segment (bytes) */time_t shm_atime; /* Last attach time */time_t shm_dtime; /* Last detach time */time_t shm_ctime; /* Last change time */pid_t shm_cpid; /* PID of creator */pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */shmatt_t shm_nattch; /* No. of current attaches */...};
[root@localhost ch14]# cat shm1.c
/* Our first program is a consumer. After the headers the shared memory segment(the size of our shared memory structure) is created with a call to shmget,with the IPC_CREAT bit specified. */#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include <sys/shm.h>#include "shm_com.h"int main()
{int running = 1;void *shared_memory = (void *)0;struct shared_use_st *shared_stuff;int shmid;srand((unsigned int)getpid()); shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);if (shmid == -1) {fprintf(stderr, "shmget failed\n");exit(EXIT_FAILURE);}/* We now make the shared memory accessible to the program. */shared_memory = shmat(shmid, (void *)0, 0);if (shared_memory == (void *)-1) {fprintf(stderr, "shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attached at %X\n", (int)shared_memory);/* The next portion of the program assigns the shared_memory segment to shared_stuff,which then prints out any text in written_by_you. The loop continues until end is foundin written_by_you. The call to sleep forces the consumer to sit in its critical section,which makes the producer wait. */shared_stuff = (struct shared_use_st *)shared_memory;shared_stuff->written_by_you = 0;while(running) {if (shared_stuff->written_by_you) {printf("You wrote: %s", shared_stuff->some_text);// sleep( rand() % 4 ); /* make the other process wait for us ! */shared_stuff->written_by_you = 0;if (strncmp(shared_stuff->some_text, "end", 3) == 0) {running = 0;}}}/* Lastly, the shared memory is detached and then deleted. */if (shmdt(shared_memory) == -1) {fprintf(stderr, "shmdt failed\n");exit(EXIT_FAILURE);}if (shmctl(shmid, IPC_RMID, 0) == -1) {fprintf(stderr, "shmctl(IPC_RMID) failed\n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);
}[root@localhost ch14]#
[root@localhost ch14]# cat shm2.c
/* The second program is the producer and allows us to enter data for consumers.It's very similar to shm1.c and looks like this. */#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include <sys/shm.h>#include "shm_com.h"int main()
{int running = 1;void *shared_memory = (void *)0;struct shared_use_st *shared_stuff;char buffer[BUFSIZ];int shmid;shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);if (shmid == -1) {fprintf(stderr, "shmget failed\n");exit(EXIT_FAILURE);}shared_memory = shmat(shmid, (void *)0, 0);if (shared_memory == (void *)-1) {fprintf(stderr, "shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attached at %X\n", (int)shared_memory);shared_stuff = (struct shared_use_st *)shared_memory;while(running) {while(shared_stuff->written_by_you == 1) {sleep(1); printf("waiting for client...\n");}printf("Enter some text: ");fgets(buffer, BUFSIZ, stdin);strncpy(shared_stuff->some_text, buffer, TEXT_SZ);shared_stuff->written_by_you = 1;if (strncmp(buffer, "end", 3) == 0) {running = 0;}}if (shmdt(shared_memory) == -1) {fprintf(stderr, "shmdt failed\n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);
}
[root@localhost ch14]# <pre name="code" class="cpp">[root@localhost ch14]# ./shm1&
[3] 6209
[root@localhost ch14]# Memory attached at B77FF000
./shm2
Memory attached at B785B000
Enter some text: hello
You wrote: hello
waiting for client...
Enter some text: hi
You wrote: hi
waiting for client...
Enter some text:
两个进程中的某段虚拟地址空间被映射到le同一段物理内存,
但是进程之间的读写时序de同步,需要进程自己来控制,例中用了共享内存中的
一个数据written_by_you来指示各个进程的动作
还可使用信号量和消息实现同步
这篇关于IPC-shm 共享内存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!