- 论坛徽章:
- 0
|
- #include "head.h"
- #define SEM_NAME "/xiaozhu"
- int main(int argc, char **argv)
- {
- int i, fd, nloop, zero = 0;
- int *addr = NULL;
- pid_t pid;
- fd = open("/dev/zero", O_RDWR);
- if(fd == -1){
- perror("open /dev/zero");
- exit(1);
- }
- addr = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, \
- fd, 0);
- if(addr == MAP_FAILED){
- perror("mmap error");
- exit(2);
- }
- close(fd);
- setbuf(stdout, NULL);
- pid = fork();
- if(pid < 0){
- perror("fork error");
- exit(3);
- }
- if(pid == 0){
- printf("child: %ld\n", (*addr)++);
- printf("child ptr address = %0x\n", addr);
- exit(0);
- }
- sleep(1);
- printf("parent: %ld\n", (*addr)++);
- printf("parent ptr address = %0x\n", addr);
- exit(0);
- }
复制代码
执行结果:
[xxxx@localhost chap12]$ ./a.out
child: 0
child ptr address = b7f88000
parent: 1
parent ptr address = b7f88000
从/dev/zero读出的字节全为0,往里写的数据全被丢弃。
程序中父进程是如何从/dev/zero中读出1的呢?
mmap()的MAP_SHARED属性改成MAP_PRIVATE后,
[zuhf@localhost chap12]$ ./a.out
child: 0
child ptr address = b7f88000
parent: 0
parent ptr address = b7f88000
MAP_PRIVATE表示对进程对共享内存所作的修改不改变底层支持的对象(这里是/dev/zero) |
|