Так что я с этой проблемой с помощью программы синхронизации процесса в С.синхронизации процесса в C не выполняется в первый раз
Я должен сделать код, который, используя fork()
, будет производить что-то вроде этого:
PARENT
PARENT
CHILD
PARENT
CHILD
PARENT
Используя код, который я нашел here, я был в состоянии сделать его работу, но по некоторым причинам, первый результат, который приходит на экран перепутались в то время как все остальные работают нормально.
Для компиляции, введите: gcc test.c display.c -o test -pthread
Во всяком случае, вот код, я тестирую (повторяю: это не мой код):
#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(void)
{
int i;
/* place semaphore in shared memory */
sem_t *sema = mmap(NULL, sizeof(sema), PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1, 0);
/* create/initialize semaphore */
if (sem_init(sema, 1, 0) < 0)
{
perror("sem_init");
exit(EXIT_FAILURE);
}
int nloop=10;
int pid = fork();
if (pid == 0)
{
for (i = 0; i < nloop; i++)
{
// child unlocks semaphore
display("CHILD\n");
if (sem_post(sema) < 0)
perror("sem_post");
sleep(1);
}
if (munmap(sema, sizeof(sema)) < 0)
{
perror("munmap");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
else
{
for (i = 0; i < nloop; i++)
{ // parent starts waiting
display("PARENT\n");
if (sem_wait(sema) < 0)
perror("sem_wait");
// parent finished waiting
}
if (sem_destroy(sema) < 0)
{
perror("sem_destroy failed");
exit(EXIT_FAILURE);
}
if (munmap(sema, sizeof(sema)) < 0)
{
perror("munmap failed");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
}
Вот результат:
PACREHNT
ILD
PARENT
CHILD
PARENT
CHILD
PARENT
CHILD
PARENT
CHILD
PARENT
CHILD
PARENT
CHILD
PARENT
CHILD
PARENT
CHILD
PARENT
CHILD
Почему это происходит в начале?
Пройдите через свой код в голове. Как родительский, так и дочерний сервер печатают сразу без какой-либо синхронизации. –
Потому что вы вызываете 'display' перед операцией семафора. – fvu