2011-05-09 4 views
0

두 프로세스간에 정수를 공유하려하지만 메모리 세그먼트가 프로그램 1에서 초기화되고 프로그램 4에서 사용됩니다. 다음은 프로그램 1의 초기화입니다.간단히 정수를 공유 메모리 세그먼트에 저장 : C

shmid = shmget(key, sizeof(int*), 0666 | IPC_CREAT); 
int *data = (int *)shmat(shmid, (void*)0,0); 

"다른 크기의 정수에서 포인터로 캐스트"라는 경고 메시지가 나타납니다. 아하.

간단하고, 나는 추측하고있다. 그러나 나는 IPC를 가진 큰 시간의 멍청하다. 그리고 C에있는 많은 다른 것들 ....

는 다음 나는 다른 프로그램에 전달할 :

snprintf(shmarg, sizeof(shmarg), "%n", data); 
pid_t pid3 = run_cmd4("/home/tropix/hw11-4", shmarg, semarg, pipe_from_p2_2, pipe_to_p5_2); 

하지만 반대편에 액세스하는 방법을 잘하지 않습니다. 어떻게 프로그램 4에서 int를 되 찾을 수 있습니까?

답변

4

shmat()을 정의하는 헤더가 누락되어 컴파일러가 shmat이 int (포인터가 아님)를 반환한다고 추측합니다.

+0

그걸 주셔서 감사합니다 :) – Josh

1

"다른 크기의 정수에서 포인터로 캐스트"라는 경고 메시지가 나타납니다. 아하.

(void*)0 대신 NULL을 사용해보십시오.

는 다음 나는 다른 프로그램에 전달할 :

snprintf(shmarg, sizeof(shmarg), "%n", data); 
pid_t pid3 = run_cmd4("/home/tropix/hw11-4", shmarg, 
         semarg, pipe_from_p2_2, pipe_to_p5_2); 

하지만 반대편에 액세스하는 방법을 잘하지 않습니다. 어떻게 프로그램 4에서 int를 되 찾을 수 있습니까?

공유 메모리 영역이 다른 프로그램의 똑같은 가상 메모리 주소에로드되지 않으면 포인터 자체가 유용하지 않습니다. 아마 그 배열을 시도하려고하지 않을 것입니다. 다른 프로그램 (hw11-4)은 공유 메모리 세그먼트를로드하고 OS가 가상 메모리 주소를 선택하게 한 다음 int에 대한 해당 주소를 간단히 봅니다. 따라서 hw11-4은 동일한 공유 메모리 키 (예 : 명령 줄 인수)를 전달해야하며 그 자체로 shmget을 열고 키를 가져온 다음 shmat을 매핑하여 공유 메모리 세그먼트를 메모리에 매핑합니다.

관련 문제