2014-12-06 2 views
1

프로그램 A와 프로그램 B가 있습니다. 프로그램 A는 공유 메모리에 shmget, shmat으로 저장된 큐를 만듭니다. 프로세스 B가 시작된 다음 동일한 shmid를 사용하여 A 프로세스가 문제없이 작성한 큐를 가져옵니다. 프로세스 A (A와 B가 동시에 명백하게 동시에 실행 중임)는 다음 큐의 특정 요소를 수정하는 메소드를 실행합니다. 프로그램 A가이 작업을 수행하면 해당 메모리 블록에 대한 포인터가 세그먼트 오류를 ​​발생시킵니다. 아마 프로그램 B가 지금 가정하는 포인터를 가리키고 있기 때문일 것입니다. 내 질문에 어떻게 프로그램 A 수 있도록 편집 할 수 및 편집 큐에서뿐만 아니라 프로그램 B 읽을 수 있습니다. 일종의 잠금 필요하지만 어떤 종류의 잠금 가장 좋을지 또는 어떻게 올바르게 알 수 없습니다. 이것을 구현하십시오. 만약 당신이 많은 도움이 될 귀하의 설명과 함께 이동하는 몇 가지 예제 코드를 올려 놓을 수 있습니다. 나는이 모든 것을 C로 쓰고있다. 그리고 프로세스 A는 2 개의 키를 가지고있다. 하나는 대기열에 있고 다른 하나는 프로그램 B의 공유 메모리에 할당 된 모든 세그먼트에 대한 모든 shmids를 보유하고있다. 그 정보.두 프로세스간에 공유 메모리를 조정하는 방법

+2

당신은 아마 당신의 문제를 이런 식으로 해결하고 싶지 않아요. 정말로 도움이 필요한 경우 근본적인 문제를 기술해야합니다. –

+0

명명 된 (시스템 전체) 세마포/뮤텍스를 사용합니다. 여기에 관련 토론이 있습니다 : http://stackoverflow.com/questions/8359322/how-to-share-semaphores-between-processes-using-shared-memory – Archie

답변

1

기본 문제를 해결할 수있는 더 좋은 방법이 될 수 있다는 의견에 동의합니다. 파이프와. 그러나, 당신이 묘사하는 것과 정확히 똑같은 테스트 코드를 가지고 있기 때문에, 당신과 공유 할 것입니다. 이 코드를 실행할 때 클라이언트를 시작하기 전에 항상 서버를 시작해야합니다.

이 코드는 공유 메모리 외에도 세마포어 쌍을 만듭니다. REQUEST_SEM은 데이터를 사용할 수 있음을 서버에 알리기 위해 클라이언트에서 사용됩니다. RESPONSE_SEM은 서버가 클라이언트의 요청으로 완료되었음을 나타 내기 위해 서버에서 사용됩니다.

공유 메모리의 크기를 변경하려면 이전에 할당 된 공유 메모리를 제거하려면 ipcrm 명령을 사용해야합니다. 또 다른 유용한 명령은 ipcs이며 사용자가 작성한 IPC 오브젝트를 나열합니다.

마지막주의 사항. 하드 코딩 된 key을 사용하는 것은 좋지 않습니다. key을 생성하는 더 좋은 방법은 ftok에 대한 설명서를 참조하십시오.

Server.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/sem.h> 
#include <sys/shm.h> 
#include <errno.h> 

#define REQUEST_SEM 0 
#define RESPONSE_SEM 1 

#define SEM_RA (SEM_R | SEM_A) 
#define SEM_FLAGS (SEM_RA | (SEM_RA >> 3) | (SEM_RA >> 6)) 
#define MEM_RW (SHM_R | SHM_W) 
#define MEM_FLAGS (MEM_RW | (MEM_RW >> 3) | (MEM_RW >> 6)) 

static void error(const char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 

void waitForIt(int semid, int semnum) 
{ 
    struct sembuf operations = { semnum, -1, 0 }; 

    if (semop(semid, &operations, 1) < 0) 
     error(__func__); 
} 

void signalIt(int semid, int semnum) 
{ 
    struct sembuf operations = { semnum, 1, 0 }; 

    if (semop(semid, &operations, 1) < 0) 
     error(__func__); 
} 

int main(int argc, char *argv[]) 
{ 
    int i, semID, memID, good, bad; 
    char *memAddress; 

    if ((semID = semget(0x1001, 2, IPC_CREAT | SEM_FLAGS)) < 0) 
     error("Unable to create semaphores"); 
    if (semctl(semID, REQUEST_SEM, SETVAL, 0) < 0) 
     error("Unable to initialize request semaphore"); 
    if (semctl(semID, RESPONSE_SEM, SETVAL, 0) < 0) 
     error("Unable to initialize response semaphore"); 

    if ((memID = shmget(0x1001, 1024, IPC_CREAT | MEM_FLAGS)) < 0) 
     error("Unable to create shared memory"); 
    memAddress = shmat(memID, NULL, 0);  
    if (memAddress == NULL || memAddress == ((void *) -1)) 
     error("Unable to attach shared memory"); 

    good = 0; 
    bad = 0; 
    for (i = 0; i < 100; i++) 
    { 
     waitForIt(semID, REQUEST_SEM); 
     if (memAddress[0] == i) 
      good++; 
     else 
      bad++; 

     memAddress[0] = 0x55; 
     signalIt(semID, RESPONSE_SEM); 
    } 

    printf("good=%d bad=%d\n", good, bad); 

    if (shmdt(memAddress) < 0) 
     error("Unable to detach shared memory"); 
} 

Client.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/sem.h> 
#include <sys/shm.h> 
#include <errno.h> 

#define REQUEST_SEM 0 
#define RESPONSE_SEM 1 

static void error(const char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 

void waitForIt(int semid, int semnum) 
{ 
    struct sembuf operations = { semnum, -1, 0 }; 

    if (semop(semid, &operations, 1) < 0) 
     error(__func__); 
} 

void signalIt(int semid, int semnum) 
{ 
    struct sembuf operations = { semnum, 1, 0 }; 

    if (semop(semid, &operations, 1) < 0) 
     error(__func__); 
} 

int main(void) 
{ 
    int i, semID, memID, good, bad; 
    char *memAddress; 

    if ((semID = semget(0x1001, 0, 0)) < 0) 
     error("Unable to get semaphores"); 

    if ((memID = shmget(0x1001, 0, 0)) < 0) 
     error("Unable to create shared memory"); 
    memAddress = shmat(memID, NULL, 0); 
    if (memAddress == NULL || memAddress == ((void *) -1)) 
     error("Unable to attach shared memory"); 

    good = 0; 
    bad = 0; 
    for (i = 0; i < 100; i++) 
    { 
     memAddress[0] = i; 
     signalIt(semID, REQUEST_SEM); 

     waitForIt(semID, RESPONSE_SEM); 
     if (memAddress[0] == 0x55) 
      good++; 
     else 
      bad++; 
    } 

    printf("good=%d bad=%d\n", good, bad); 

    if (shmdt(memAddress) < 0) 
     error("Unable to detach shared memory"); 
} 
관련 문제