프로그램 A와 프로그램 B가 있습니다. 프로그램 A는 공유 메모리에 shmget, shmat으로 저장된 큐를 만듭니다. 프로세스 B가 시작된 다음 동일한 shmid를 사용하여 A 프로세스가 문제없이 작성한 큐를 가져옵니다. 프로세스 A (A와 B가 동시에 명백하게 동시에 실행 중임)는 다음 큐의 특정 요소를 수정하는 메소드를 실행합니다. 프로그램 A가이 작업을 수행하면 해당 메모리 블록에 대한 포인터가 세그먼트 오류를 발생시킵니다. 아마 프로그램 B가 지금 가정하는 포인터를 가리키고 있기 때문일 것입니다. 내 질문에 어떻게 프로그램 A 수 있도록 편집 할 수 및 편집 큐에서뿐만 아니라 프로그램 B 읽을 수 있습니다. 일종의 잠금 필요하지만 어떤 종류의 잠금 가장 좋을지 또는 어떻게 올바르게 알 수 없습니다. 이것을 구현하십시오. 만약 당신이 많은 도움이 될 귀하의 설명과 함께 이동하는 몇 가지 예제 코드를 올려 놓을 수 있습니다. 나는이 모든 것을 C로 쓰고있다. 그리고 프로세스 A는 2 개의 키를 가지고있다. 하나는 대기열에 있고 다른 하나는 프로그램 B의 공유 메모리에 할당 된 모든 세그먼트에 대한 모든 shmids를 보유하고있다. 그 정보.두 프로세스간에 공유 메모리를 조정하는 방법
1
A
답변
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");
}
관련 문제
- 1. 두 프로세스간에 어레이 공유
- 2. 프로세스간에 동일한 키가 공유 메모리를 사용하여 서로 통신하는 방법
- 3. C에서 두 프로세스간에 개체 공유
- 4. 여러 프로세스간에 공유 객체 공유
- 5. 호스트 프로세스간에 cuda GPU 장치 메모리를 공유 할 수 있습니까?
- 6. Android에서 두 프로세스간에 JavaVM 객체 공유
- 7. 서로 다른 두 프로세스간에 OpenSSL BIO 공유
- 8. win32에서 두 프로세스간에 동일한 stdout 공유, C++
- 9. BlockingCollection을 프로세스간에 공유
- 10. Linux에서 프로세스간에 공유되는 메모리를 보호하는 방법
- 11. Python에서 프로세스간에 데이터 공유
- 12. 서로 다른 CPU에있는 프로세스간에 공유 메모리를 향상시킬 수 있습니다
- 13. 자식 프로세스간에 공유 메모리를 통해 세마포를 공유하려면 어떻게해야합니까?
- 14. 서비스와 사용자 프로세스간에 메모리를 공유하는 방법은 무엇입니까?
- 15. 다른 프로세스간에 HDC 공유
- 16. mod_python 프로세스간에 데이터 공유
- 17. Java 프로세스간에 객체 공유
- 18. 하위 프로세스간에 포인터 공유
- 19. Linux에서 프로세스간에 클래스 객체 공유
- 20. 여러 프로세스간에 파일 공유 [Perl]
- 21. Windows에서 공유 메모리를 사용하는 방법
- 22. 어떻게 부모 - 자식 프로세스간에 메모리를 공유 할 수 있습니다 그들이 죽을 때 메모리를 자동으로 해제
- 23. mmap()을 사용하여 프로세스간에 메모리 공유
- 24. 모든 PHP 프로세스간에 변수/메모리 공유
- 25. 다른 프로세스간에 dll 데이터 공유
- 26. 여러 프로세스간에 결과 큐 공유
- 27. 프로세스간에 읽기 전용 개체 공유
- 28. 부모와 자식 프로세스간에 리소스 공유
- 29. 리눅스 : 프로세스간에 코드를 공유 할 수 있습니까?
- 30. 다른 프로세스간에 열린 파일 디스크립터 공유
당신은 아마 당신의 문제를 이런 식으로 해결하고 싶지 않아요. 정말로 도움이 필요한 경우 근본적인 문제를 기술해야합니다. –
명명 된 (시스템 전체) 세마포/뮤텍스를 사용합니다. 여기에 관련 토론이 있습니다 : http://stackoverflow.com/questions/8359322/how-to-share-semaphores-between-processes-using-shared-memory – Archie