共享内存 linux
Shared memory linux
我第一次尝试使用共享内存。我创建了一个子进程,我从 Parent 写入共享内存并从 Child 更改它,在程序结束之前我从 Parent 打印共享内存并且共享内存没有改变,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <signal.h>
sem_t *semaphore;
int main(){
int i = 0, status;
pid_t pid=fork(), w;
int id;
if ((id = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666)) == -1){
perror("shmget");
exit(1);
}
int *sh;
if ((sh =(int *) shmat(id, NULL, 0)) == NULL){
perror("shmat");
exit(1);
}
*sh = 10;
if ((semaphore = sem_open("/semaphore", O_CREAT, 0666, 0)) == SEM_FAILED){
perror("semaphore");
exit(1);
}
if (pid==0) {
while(1){
sleep(1);
*sh = 50;
printf("child %d, %d\n", i, *sh);
i++;
if(i == 5){
sem_post(semaphore);
exit(0);
}
}
} else if (pid==-1) {
perror("process error\n");
} else {
printf("Parent, %d\n", *sh);
sem_wait(semaphore);
printf("child end => parent end\n");
printf("Parent, %d\n", *sh);
}
shmctl(id, IPC_RMID, NULL);
sem_close(semaphore);
sem_unlink("/semaphore");
return 0;
}
如果我对共享内存有一点了解,那么我可以从任何地方更改它,如果我有一个指针在我的例子中是 "sh"。
程序输出为:
Parent, 10
child 0, 50
child 1, 50
child 2, 50
child 3, 50
child 4, 50
child end => parent end
Parent, 10
为什么共享内存中的数字在Parent 和Child 中不同?
您 fork()
在使用密钥 IPC_PRIVATE
创建共享内存之前,因此两个进程都创建了自己的共享内存并且实际上并不共享它。
如果从
中删除=fork()
pid_t pid=fork(), w;
并插入
pid = fork();
在 shmget
调用之后的某处,它按您预期的方式工作,因为子进程将从父进程继承共享内存标识符,而不是创建一个不同的标识符。
我第一次尝试使用共享内存。我创建了一个子进程,我从 Parent 写入共享内存并从 Child 更改它,在程序结束之前我从 Parent 打印共享内存并且共享内存没有改变,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <signal.h>
sem_t *semaphore;
int main(){
int i = 0, status;
pid_t pid=fork(), w;
int id;
if ((id = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666)) == -1){
perror("shmget");
exit(1);
}
int *sh;
if ((sh =(int *) shmat(id, NULL, 0)) == NULL){
perror("shmat");
exit(1);
}
*sh = 10;
if ((semaphore = sem_open("/semaphore", O_CREAT, 0666, 0)) == SEM_FAILED){
perror("semaphore");
exit(1);
}
if (pid==0) {
while(1){
sleep(1);
*sh = 50;
printf("child %d, %d\n", i, *sh);
i++;
if(i == 5){
sem_post(semaphore);
exit(0);
}
}
} else if (pid==-1) {
perror("process error\n");
} else {
printf("Parent, %d\n", *sh);
sem_wait(semaphore);
printf("child end => parent end\n");
printf("Parent, %d\n", *sh);
}
shmctl(id, IPC_RMID, NULL);
sem_close(semaphore);
sem_unlink("/semaphore");
return 0;
}
如果我对共享内存有一点了解,那么我可以从任何地方更改它,如果我有一个指针在我的例子中是 "sh"。
程序输出为:
Parent, 10
child 0, 50
child 1, 50
child 2, 50
child 3, 50
child 4, 50
child end => parent end
Parent, 10
为什么共享内存中的数字在Parent 和Child 中不同?
您 fork()
在使用密钥 IPC_PRIVATE
创建共享内存之前,因此两个进程都创建了自己的共享内存并且实际上并不共享它。
如果从
中删除=fork()
pid_t pid=fork(), w;
并插入
pid = fork();
在 shmget
调用之后的某处,它按您预期的方式工作,因为子进程将从父进程继承共享内存标识符,而不是创建一个不同的标识符。