Chinaunix
标题:
共享内存,再麻烦一下
[打印本页]
作者:
andyY
时间:
2003-12-18 23:22
标题:
共享内存,再麻烦一下
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倒是很快就有输出,为什么会有开始这种情况呢?
先谢过!
作者:
rabbit008
时间:
2003-12-19 05:31
标题:
共享内存,再麻烦一下
我觉得,你把printf & getchar 注释取消,那么共享内存中的值变化的就快一些,这样在读中的条件就满足的快,所以输出的快
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;
}
作者:
andyY
时间:
2003-12-25 00:26
标题:
共享内存,再麻烦一下
后来在while{}中加了usleep(10),所有的改变都能得到了。之前getchar被注释时可能是进程调度问题吧,只能得到很少的改变。不是太明白,先就这样再说,不知有没有深入的解释?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2