В настоящее время я пытаюсь реализовать одну программу на 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