- 论坛徽章:
- 0
|
myread.c
- #include
- #define PATHNAME "/home/yz"
- #define PROJID 1
- #define LENGTH 5*sizeof(int)
- void Initwrlock(struct flock *flock);
- void Getwrlock(struct flock *flock);
- void Releasewrlock(struct flock *flock);
- int fd_lck;
- int main()
- {
- struct flock myflock;
- int shmid;
- key_t mykey;
- int *myshm,myshm_pre;
- struct timeval tv;
- //init lock
- Initwrlock(&myflock);
- //get key_t
- mykey = ftok(PATHNAME,PROJID);
- if(mykey == (key_t)-1)
- {
- perror("ftok failed ");
- exit(errno);
- }
-
- //get shm
- shmid = shmget(mykey,LENGTH,IPC_CREAT|IPC_EXCL|00777);
- if(shmid == -1)
- {
- if (errno == EEXIST)
- shmid = shmget(mykey,LENGTH,0);
- if(shmid == -1)
- {
- perror("shmget failed ");
- exit(errno);
- }
- }
- //attach
- myshm = (int *)shmat(shmid,NULL,0);
- if(myshm == (int *)-1)
- {
- perror("shmat failed ");
- exit(errno);
- }
- myshm_pre = *myshm;
- while(1)
- {
- //get wrlock
- Getwrlock(&myflock);
- //read
- if(myshm_pre != *myshm)
- {
- gettimeofday(&tv,NULL);
- printf("read new :%d\ttime:%ld,%ld\n",
- *myshm,tv.tv_sec,tv.tv_usec);
- myshm_pre = *myshm;
- }
-
- //release wrlock
- Releasewrlock(&myflock);
- }
-
- }
- void Initwrlock(struct flock *flock)
- {
- fd_lck = open("./shm.lck",O_CREAT|O_RDWR,00777);
- if(fd_lck<0)
- {
- perror("open failed ");
- exit(errno);
- }
- flock->;l_whence = SEEK_SET;
- flock->;l_start = 0;
- flock->;l_len = 0;
- }
- void Getwrlock(struct flock *flock)
- {
- flock->;l_type = F_WRLCK;
- if(fcntl(fd_lck,F_SETLKW,flock) == -1)
- {
- perror("fcntl failed ");
- exit(errno);
- }
- }
- void Releasewrlock(struct flock *flock)
- {
- flock->;l_type = F_UNLCK;
- if(fcntl(fd_lck,F_SETLKW,flock) == -1)
- {
- perror("fcntl failed ");
- exit(errno);
- }
- }
复制代码
mywrite.c
- #include
- #define PATHNAME "/home/yz"
- #define PROJID 1
- #define LENGTH 5*sizeof(int)
- void Initwrlock(struct flock *flock);
- void Getwrlock(struct flock *flock);
- void Releasewrlock(struct flock *flock);
- int fd_lck;
- int main()
- {
- struct flock myflock;
- int shmid,i;
- key_t mykey;
- int *myshm;
- struct timeval tv;
- //init lock
- Initwrlock(&myflock);
- //get key_t
- mykey = ftok(PATHNAME,PROJID);
- if(mykey == (key_t)-1)
- {
- perror("ftok failed ");
- exit(errno);
- }
-
- //get shm
- shmid = shmget(mykey,LENGTH,IPC_CREAT|IPC_EXCL);
- if(shmid == -1)
- {
- if (errno == EEXIST)
- shmid = shmget(mykey,LENGTH,0);
- if(shmid == -1)
- {
- perror("shmget failed ");
- exit(errno);
- }
- }
- //attach
- myshm = (int *)shmat(shmid,NULL,0);
- if(myshm == (int *)-1)
- {
- perror("shmat failed ");
- exit(errno);
- }
- i=0;
-
- alarm(10);
-
- while(1)
- {
- //write
- // printf("press ENTER to write new value :\n");
- // getchar();
- //get wrlock
- Getwrlock(&myflock);
- *myshm = i;
- gettimeofday(&tv,NULL);
- printf("write new :%d\ttime:%ld,%ld\n",
- *myshm,tv.tv_sec,tv.tv_usec);
-
- //release wrlock
- Releasewrlock(&myflock);
- i = (i+1)%10000;
- }
-
- }
复制代码
mywrite持续写10秒,期间myread输出只有几条,第一次 - 6条 / 二 - 1 / 三- 6 ,共享应该所有write 都能得到吧?
如果把 mywrite.c 中while 循环中得 printf & getchar 注释取消,myread倒是很快就有输出,为什么会有开始这种情况呢?
先谢过! |
|