我有两个程序,一个将数据写入共享内存,另一个程序从中读取数据。编写器假设在共享存储器中写入数据0-9然后等待单元读取器读取该数据并将其显示在屏幕上并发信号通知写入器进程,然后写入器将数据10-19写入共享存储器然后等待读取器读取和显示数据到屏幕和信号写入到结束过程。
作家代码:
#define SHMKEY 75
int shmid;
void cleanup(int);
int main (void) {
int *pint, *ppint, i;
for (i=0;i<20;i++) signal(i,cleanup);
shmid=shmget(SHMKEY, 128,0666|IPC_CREAT);
pint=(int *)shmat(shmid,0,0);
ppint=pint;
for(i=0;i<10;i++) { *ppint++ = i };
*pint=-1;
kill(getpid(), SIGSTOP);
for(i=10;i<20;i++) { *ppint++ = i };
*pint=-1;
kill(getpid(), SIGSTOP);
return 0;
}
void cleanup(int x) {
shmctl(shmid,IPC_RMID,0);
exit(0);
}
读者代码:
#define SHMKEY 75
int main(int argc, char *argv[]) //expects pid of writer as clarg
{
int i, *pint, *pint1, shmid;
int pid= atoi(argv[1]);
shmid=shmget(SHMKEY, 128,0666);
pint=(int *)shmat(shmid,0,0);
while(*pint != -1);
for(i=0;i<10;i++) printf("%d\n",*pint++);
// Reset busy wait flag so it continues to wait
*pint=0;
kill(pid, SIGCONT);
printf("Signal 1\n");
while(*pint != -1);
for(i=10;i<19;i++) printf("%d\n",*pint++);
kill(pid, SIGCONT);
printf("Signal 2\n");
}
运行两个终端窗口的输出:
$./writer &
[1] 9350
$ ./reader 9350
-1
1
2
3
4
5
6
7
8
9
Signal 1
(hangs)
我似乎是在阅读器中第二个繁忙的等待循环后挂了,但我不明白为什么?因为我在忙碌的等待之前发送信号给作者取消设置标志* pint = -1。