儲存對映IO(二)
阿新 • • 發佈:2018-12-18
mmap父子程序間通訊
1. 測試程式碼:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/wait.h> int var = 100; int main(void) { int *p; pid_t pid; int fd; fd = open("temp", O_RDWR | O_CREAT | O_TRUNC, 0644); if(fd < 0) { perror("open error"); exit(1); } unlink("temp"); //刪除臨時檔案目錄項,使之具備被釋放條件 ftruncate(fd, 4); p = (int *) mmap(NULL, 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(p == MAP_FAILED) { perror("mmap error"); exit(1); } close(fd); //對映區建立完畢,即可關閉檔案 pid = fork(); //建立子程序 if(pid == 0) { *p = 2000; var = 1000; printf("child, *P = %d, var = %d\n", *p, var); } else { sleep(1); printf("parent, *p = %d, var = %d\n", *p, var); wait(NULL); int ret = munmap(p, 4); //釋放對映區 if(ret == -1) { perror("munmap error"); exit(1); } } return 0; }
輸出結果:
2. 測試程式碼:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/wait.h> int var = 100; int main(void) { int *p; pid_t pid; int fd; fd = open("temp", O_RDWR | O_CREAT | O_TRUNC, 0644); if(fd < 0) { perror("open error"); exit(1); } unlink("temp"); //刪除臨時檔案目錄項,使之具備被釋放條件 ftruncate(fd, 4); p = (int *) mmap(NULL, 4, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if(p == MAP_FAILED) { perror("mmap error"); exit(1); } close(fd); //對映區建立完畢,即可關閉檔案 pid = fork(); //建立子程序 if(pid == 0) { *p = 2000; var = 1000; printf("child, *P = %d, var = %d\n", *p, var); } else { sleep(1); printf("parent, *p = %d, var = %d\n", *p, var); wait(NULL); int ret = munmap(p, 4); //釋放對映區 if(ret == -1) { perror("munmap error"); exit(1); } } return 0; }
輸出結果: