我目前正在嘗試實現一個爲給定進程創建共享內存區域的C程序,然後將此進程分叉爲一個子進程,使子進程寫入共享內存的給定位置,讓父親等待,直到孩子寫在那個位置。我使用了一種簡單的忙碌等待方法,讓父進程等待,直到孩子用一個while循環結束他的寫作。問題是隻有當我在該循環中引入一些延遲時才起作用。任何人都知道這是爲什麼?忙碌的等待和共享內存
代碼:
int shmid;
int *shmptr;
int i, j, ret;
key_t key = SHM_KEY;
// Create shared memory segment
if ((shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0600)) < 0)
{
printf("shmget error: %s\n", strerror(errno));
return -1;
}
// Attach shared memory segment
if ((shmptr = shmat(shmid, 0, 0)) == (void *) -1)
{
puts("shmat error");
return -1;
}
shmptr[6] = '%';
ret = fork();
if (ret > 0)
{/*parent*/
/*here is the loop that implements the busy waiting approach*/
while (shmptr[6] != '^') {
sleep(1);
}
for (i = 0; i < 7; i++) printf("%c", shmptr[i]);
puts("");
int status = 0;
wait(&status);
}
else
{/*child*/
shmptr[0] = 's';
shmptr[1] = 'h';
shmptr[2] = 'a';
shmptr[3] = 'r';
shmptr[4] = 'e';
shmptr[5] = 'd';
/*tell parent process ithas finished its writing*/
shmptr[6] = '^';
exit(0);
}
如何shmptr聲明?特別是它是不穩定的? – DoxyLover
你能詳細說明你的代碼還是發佈整個代碼? –
「*只有當我在該循環中引入一些延遲時才起作用*」儘管發生什麼事情沒有延遲? – alk