#include #include #include #include #define _GNU_SOURCE /* or _BSD_SOURCE or _SVID_SOURCE */ #include #include /* For SYS_xxx definitions */ #include #include #include #include #include #include #include #include #include #define PAGE_SIZE (4096) int addr1=1; int my_shmget(key_t key, int page_count, int *shmid, void **shmaddr) { int i, j, k; void *start_addr = NULL; if ((*shmid =shmget(key, PAGE_SIZE*page_count, IPC_CREAT|0666 )) < 0) { perror("Failure:"); return -1; } *shmaddr = shmat(*shmid, start_addr, SHM_RDONLY) ; if (*shmaddr == (void *) -1) { perror("shmget:Shared Memory Attach Failure:"); shmctl(*shmid, IPC_RMID, NULL); return -1; } return 0; } int my_shmput(int shmid, void *shmaddr) { if (shmdt((const void *)shmaddr) != 0) { perror("Detached Failure:"); return -1; } if(shmctl(shmid, IPC_RMID, NULL) != 0) { perror("Remove shm id of htlb page failure!\n"); return -1; } return 0; } int main() { int * uaddr = &addr1, *uaddr2; void * lp; int ret; int shmid; void *shmaddr; if(my_shmget(10673861, 10, &shmid, &shmaddr)) exit(0); uaddr2 = shmaddr; //uaddr2 = 0; ret = syscall(__NR_futex, uaddr, FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, 1, NULL, uaddr2, 1); printf("ret=%d\n", ret); my_shmput(shmid, shmaddr); return 0; }