Posix Semaphore에서 공유 메모리 사용 C에서 대기 및 신호

잠-옥시

아래 코드를 예로 들어 보겠습니다. 인쇄 후 코드는 프로그램을 수동으로 중지 할 때까지 기다리지 만 다음 기능을 알리지 않습니다. 여러 번 확인하고 (상호 배제를 제거하더라도) foror 안에있는 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

CUDA 공유 메모리 문제 (및 python / ctypes에서 CUDA 사용)

분류에서Dev

프로세서가 POSIX 공유 메모리에 대한 변경 사항을 보지 못합니까?

분류에서Dev

ArrayFire에서 공유 메모리 사용

분류에서Dev

POSIX 공유 메모리 및 msync

분류에서Dev

.so에서 사용하기 위해 공유 메모리에 객체 넣기

분류에서Dev

pathinfo () 및 쓰기 불가능한 디렉토리를 사용한 공유 호스팅에 대한 Laravel 5 문제

분류에서Dev

Azure AKS 대시 보드에서 CPU 및 메모리 사용량보기

분류에서Dev

목록에서 글 머리 기호 대신 아이콘 사용

분류에서Dev

공유 라이브러리에 대한 메모리 쓰기 보호

분류에서Dev

공유 메모리에 고정 크기 기호 유지

분류에서Dev

공유 메모리에 고정 크기 기호 유지

분류에서Dev

2D 배열에 대해 mmap ()을 사용하여 공유 메모리를 초기화하는 경우 후속 포인터에 대한 메모리도 매핑해야합니까? 대신 shm을 사용해야합니까?

분류에서Dev

공유 메모리에서 세마포라는 POSIX를 항상 unlink ()

분류에서Dev

정규식 및 POSIX 문자 클래스를 사용하여 R에서 암호 유효성 검사

분류에서Dev

C #에서 '?', '$'및 ':'기호 사용

분류에서Dev

C에서 공유 메모리 버퍼에 쓰기 문제

분류에서Dev

여러 클라이언트에서 공유 메모리 및 세마포어 사용

분류에서Dev

병렬 실행 및 메모리 공유를 위해 Linux 용 pthread에 대한 대안이 있습니까?

분류에서Dev

C에서 POSIX Semaphore를 사용한 다중 스레딩

분류에서Dev

ovh 공유 호스팅 Windows 서버에서 PHP 메일 기능 사용

분류에서Dev

C ++ WIN32 공유 메모리에 정수 및 부울 배열 만들기

분류에서Dev

fork () 및 c에서 신호 처리를 사용한 프로그램

분류에서Dev

C ++ 공유 메모리가있는 파일에서 읽기

분류에서Dev

C #에서 F # 비동기 메서드 호출 및 대기

분류에서Dev

모든 프로세서가 메모리를 공유 할 때 OpenMP 대신 MPI를 사용하는 점이 있습니까?

분류에서Dev

법선에 모델 공간 대신 카메라 공간을 사용하는 이유는 무엇입니까?

분류에서Dev

공유 메모리의 POSIX 이름없는 세마포가 게시 또는 대기에 응답하지 않습니다.

분류에서Dev

공유 메모리를 사용하기 전에 내 GPU가 모든 전용 메모리를 사용하지 않는 이유는 무엇입니까?

분류에서Dev

C에서 POSIX Regex 사용

Related 관련 기사

  1. 1

    CUDA 공유 메모리 문제 (및 python / ctypes에서 CUDA 사용)

  2. 2

    프로세서가 POSIX 공유 메모리에 대한 변경 사항을 보지 못합니까?

  3. 3

    ArrayFire에서 공유 메모리 사용

  4. 4

    POSIX 공유 메모리 및 msync

  5. 5

    .so에서 사용하기 위해 공유 메모리에 객체 넣기

  6. 6

    pathinfo () 및 쓰기 불가능한 디렉토리를 사용한 공유 호스팅에 대한 Laravel 5 문제

  7. 7

    Azure AKS 대시 보드에서 CPU 및 메모리 사용량보기

  8. 8

    목록에서 글 머리 기호 대신 아이콘 사용

  9. 9

    공유 라이브러리에 대한 메모리 쓰기 보호

  10. 10

    공유 메모리에 고정 크기 기호 유지

  11. 11

    공유 메모리에 고정 크기 기호 유지

  12. 12

    2D 배열에 대해 mmap ()을 사용하여 공유 메모리를 초기화하는 경우 후속 포인터에 대한 메모리도 매핑해야합니까? 대신 shm을 사용해야합니까?

  13. 13

    공유 메모리에서 세마포라는 POSIX를 항상 unlink ()

  14. 14

    정규식 및 POSIX 문자 클래스를 사용하여 R에서 암호 유효성 검사

  15. 15

    C #에서 '?', '$'및 ':'기호 사용

  16. 16

    C에서 공유 메모리 버퍼에 쓰기 문제

  17. 17

    여러 클라이언트에서 공유 메모리 및 세마포어 사용

  18. 18

    병렬 실행 및 메모리 공유를 위해 Linux 용 pthread에 대한 대안이 있습니까?

  19. 19

    C에서 POSIX Semaphore를 사용한 다중 스레딩

  20. 20

    ovh 공유 호스팅 Windows 서버에서 PHP 메일 기능 사용

  21. 21

    C ++ WIN32 공유 메모리에 정수 및 부울 배열 만들기

  22. 22

    fork () 및 c에서 신호 처리를 사용한 프로그램

  23. 23

    C ++ 공유 메모리가있는 파일에서 읽기

  24. 24

    C #에서 F # 비동기 메서드 호출 및 대기

  25. 25

    모든 프로세서가 메모리를 공유 할 때 OpenMP 대신 MPI를 사용하는 점이 있습니까?

  26. 26

    법선에 모델 공간 대신 카메라 공간을 사용하는 이유는 무엇입니까?

  27. 27

    공유 메모리의 POSIX 이름없는 세마포가 게시 또는 대기에 응답하지 않습니다.

  28. 28

    공유 메모리를 사용하기 전에 내 GPU가 모든 전용 메모리를 사용하지 않는 이유는 무엇입니까?

  29. 29

    C에서 POSIX Regex 사용

뜨겁다태그

보관