我正在使用與shmget
和shmat
共享內存用於教育目的。
我試圖讓一個內存塊只能由它的創建者進行修改,而所有其他進程只能讀取。
但讀者進程可以以某種方式寫入沒有任何錯誤。
這是我的共享內存的創建者代碼:共享內存忽略Linux中的只讀標誌c
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
int main(){
int shmid = shmget((key_t)56666, 1, IPC_CREAT | O_RDONLY);
if (shmid ==-1) {
perror("Err0:");
exit(EXIT_FAILURE);
}
void* shmaddr = shmat(shmid, (void *)0,0);
if (shmaddr == (void *)-1) {
perror("Err:");
exit(EXIT_FAILURE);
}
*(char*)shmaddr = 'a';
putchar(*(char*)shmaddr);
while(1);
return 0;
}
這是我的讀者代碼:
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
int main(){
int shmid = shmget((key_t)56666, 4, O_RDONLY);
if (shmid ==-1) {
perror("Err0:");
exit(EXIT_FAILURE);
}
void* shmaddr = shmat(shmid, (void *)0,0);
if (shmaddr == (void *)-1) {
perror("Err:");
exit(EXIT_FAILURE);
}
*(char*)shmaddr = 'b';
putchar(*(char*)shmaddr);
return 0;
}
正如你所看到的讀者可以編輯的內存,但即使我在讀取器中將內存打開爲只讀並且在共享內存的創建者中使用只讀標誌創建內存,也不會發生錯誤。
'shmget'不理解'O_RDONLY'標誌,因爲它是'open',而不是'shmget'的標誌。事實上,在Linux上,'O_RDONLY'標誌被定義爲0. – Art
@藝術我也嘗試了'0444'而不是'O_RDONLY',但是我得到了相同的結果。 – TheLogicGuy
'SHM_RDONLY'會更好。 – Stargateur