세그먼트 오류..? 이것 좀 봐주세요
글쓴이: cloudstrife / 작성시간: 월, 2007/10/22 - 8:10오후
#include
#include
#include
void main()
{
int pid;
int shmid;
char* shmAddr;
int status;
pid = fork();
if( pid != 0 )
{
shmid = shmget(1234 , 1024 , IPC_CREAT|0666);
shmAddr = (char*) shmat(shmid, 0, 0);
strcpy(shmAddr, "sohn");
printf("process1 sent message sohn to sharedMemory\n");
wait(&status);
shmctl(shmid, IPC_RMID, 0);
}
else
{
printf("process2 will receive message\n");
shmid = shmget(1234, 1024, 0666);
shmAddr = shmat(shmid, 0, 0);
printf("MESSAGE:%s\n", shmAddr);
}
}
세그먼트 오류라네요.. 제 입장에서는 잘 모르겠는데 조언 부탁드립니다.
Forums:
다중 프로세스
다중 프로세스 상태라, 스케쥴러의 영향에따라 실행이 달라질 수 있어서, 정확한 원인은 예측하기 어렵지만, 코드상으로 예측하건데, 지금 같은 코드로는 부모 프로세스의 shmget 호출보다 자식 프로세스의 shmget 호출이 더 먼저 실행될 수 있습니다.
이런 경우라면 존재치 않는 공유메모리에 대해 shmget/shmat 하기 때문에, 결과적으로 NULL 포인터에 접근하게 되고 세크폴트가 됩니다.
스케쥴러 상황에따라 죽는 현상이 나타나지 않는 경우도 있을 수 있습니다만 명백히 잘못된 코드입니다.
세마포어등을 이용해서 동기화할 필요가 있습니다. 우선 shmget, shmat 의 리턴값들을 확인해보세요.
Orion Project : http://orionids.org
음... 이 문제만 놓고
음... 이 문제만 놓고 보면 굳이 동기화 할 필요 없이, fork 전에 shmget 을 하는 게 좋을 것 같군요. 반드시 fork 후에 shmget 이 필요한 경우라면 동기화 해야 하구요.
Orion Project : http://orionids.org
아.......
감사합니다. fork써서...해야 하므로 동기화를 해줘야 겠군요
세마포어로 해줘야 하나..
댓글 달기