使用共享内存的 IPC
Posted
技术标签:
【中文标题】使用共享内存的 IPC【英文标题】:IPC using shared memory 【发布时间】:2012-02-16 17:15:53 【问题描述】:我正在编写一个简单的代码,其中父进程和子进程使用共享内存方法共享一个队列。但是,当子进程修改共享数据时,它不会以某种方式反映父进程,而父进程仍在访问先前的值。 我在其中附上了我正在尝试做的示例代码:
int main()
/* Declare fork variables */
pid_t childpid;
/* Declare shared memory variables */
key_t key;
int shmid;
int *front;
int *rear;
int i;
/* Declare semaphore variables */
sem_t sem;
int pshared = 1;
unsigned int value = 1;
/* Initialize Shared Memory */
key = ftok("thread1.c",'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
/* Attach to Shared Memory */
rear = shmat(shmid, (void *)0, 0);
if(rear == (int *)(-1))
perror("shmat");
front = shmat(shmid, (void *)0, 0);
if(front == (int *)(-1))
perror("shmat");
/* Write initial value to shared memory */
rear= front;
/* Write to Shared Memory */
for(i=0; i<5; i++)
rear[i] = 5000+(i+1);
printf("value of front is: %d", *front);
rear = &rear[i-1];
/* Initialize Semaphore */
if((sem_init(&sem, pshared, value)) == 1)
perror("Error initializing semaphore");
exit(1);
if((childpid = fork()) < 0) // error occured
perror("Fork Failed");
exit(1);
else if(childpid == 0) // child process
printf("came in child process\n");
sem_wait(&sem);
for(i=0; i<3; i++)
printf("rear is: %d", *rear);
rear--;
sem_post(&sem);
shmdt(rear);
else // parent process
/* Write to Shared Memory */
wait(1);
sem_wait(&sem);
printf("came in parent process and rear is: %d\n", *rear);
sem_post(&sem);
shmdt(rear);
return 0;
提前致谢!
【问题讨论】:
可能是一个多余的问题,但什么语言?看起来像 C/C++? 【参考方案1】:rear = shmat(shmid, (void *)0, 0);
front = shmat(shmid, (void *)0, 0);
您正在尝试创建 2 个具有相同共享内存 ID 的单独变量。
尝试使用 2 个密钥和 2 个共享内存。
key1 = ftok("thread1.c",'A');
key2 = ftok("thread1.c",'B');
shmid1 = shmget(key, 1024, 0644 | IPC_CREAT);
shmid2 = shmget(key, 1024, 0644 | IPC_CREAT);
rear = shmat(shmid1, (void *)0, 0);
front = shmat(shmid2, (void *)0, 0);
【讨论】:
以上是关于使用共享内存的 IPC的主要内容,如果未能解决你的问题,请参考以下文章
Linux进程IPC浅析[进程间通信SystemV共享内存]