아래 코드를 예로 들어 보겠습니다. 인쇄 후 코드는 프로그램을 수동으로 중지 할 때까지 기다리지 만 다음 기능을 알리지 않습니다. 여러 번 확인하고 (상호 배제를 제거하더라도) for
or 안에있는 while
것이 문제의 원인 이라는 것을 발견했습니다 .
다른 사용자에 따르면 이 작업을 수행하려면 공유 메모리 를 사용해야 하지만 사용 방법이나 특정 코드에 적용하는 방법을 모릅니다.
이 상황을 더 잘 이해하기 위해 https://www.geeksforgeeks.org/posix-shared-memory-api/ 와 같은 많은 웹 사이트를 살펴 보았습니다.
내가 본 가장 권장되는 것은 shmget()
및 mmap()
입니다.
그래서 질문, sem_wait()
공유 메모리를 사용하여 모든 유형의 루프 내 에서 어떻게 작업 할 수 있습니까?
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
sem_t *mutex;
void wait_t(int a)
{
for (int i = 0; i < 3; i++)
{
if (a < 0)
{
sem_wait(&mutex);
printf("waiting\n"); //Stops here due lack of shared memory
}
a--;
}
}
void signal_t(int a)
{
for (int i = 0; i < 3; i++)
{
if (a <= 0)
{
printf("signal\n");
sem_post(&mutex);
}
a++;
}
}
int main()
{
int shared_mem_id = shmget(IPC_PRIVATE, sizeof(sem_t), IPC_CREAT);
mutex = shmat(shared_mem_id, NULL, 0);
sem_init(&mutex, 1, 1);
int i = -2;
if(fork() == 0){ // create 1st child process
mutex = shmat(shared_mem_id, NULL, 0);
wait_t(i);
exit(0);
shmdt(mutex);
}
wait(NULL);
if(fork() == 0){ // create 2nd child process
mutex = shmat(shared_mem_id, NULL, 0);
signal_t(i);
exit(0);
shmdt(mutex);
}
wait(NULL);
if(fork() == 0){ // create 3nd child process
mutex = shmat(shared_mem_id, NULL, 0);
signal_t(i);
exit(0);
shmdt(mutex);
}
wait(NULL);
printf("%d\n", i);
exit(0);
}
따라서 아이디어는 부모 프로세스가 새 공유 메모리 공간을 만들어야한다는 것입니다.
shared_mem_id = shmemget(IPC_PRIVATE, sizeof(sem_t), IPC_CREAT);
그런 다음 세마포에 액세스해야하는 모든 프로세스는 다음을 수행해야합니다.
sem_t *mutex = shmat(shared_mem_id, NULL, 0);
(따라서 포크 후 각 하위 프로세스에서이 작업을 수행해야합니다.)
그런 다음 세마포어를 사용하는 함수는 뮤텍스 포인터에 액세스해야합니다 (뮤텍스에 역 참조를 추가하는 것을 잊지 마십시오).
완료되면 뮤텍스를 사용하는 각 프로세스는 다음을 수행해야합니다.
shmdt(mutex);
물론 충분한 공간을 할당하는 한 공유 메모리에 더 복잡한 구조를 자유롭게 저장할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다