pipe를 이용한 ipc관련 질의입니다.
글쓴이: seongwon1 / 작성시간: 목, 2003/11/27 - 2:13오후
안녕하세요?
pipe를 통해서 ipc를 하는데 잘 되지 않아 이렇게 질문을 드립니다.
일단 코드를 간단히 설명 드리면요.
pipe(file_pipe)..... pipe(file_pipe1)......
이런식으로 파이프를 2개 만들었구요.
fork를 해서 자식프로세서를 총 3개 만들었습니다.
for(i = 0 ; i < 3; i++) { pid[i] = fork(); }
이런식으로요.
그리고 나서 하나의 자식 프로세서 예를 들어 pid[0]이라는 프로세스에서
2개의 함수를 호출합니다.
if(pid[0]){ a(); b(); }
이런식으로요. 함수 a 에서는 부모에서 write한 파일 디스크립터 file_pipe의
내용을 읽어보면 정상적으로 읽어 오거든요.
그런데 함수 b에서는 엉뚱한 값이 읽혀 집니다. 다른 프로세스에서 내용을
바꾸지 않았나 의심할 수도 있겠습니다만 세마포어를 통해 동시에 파일
디스크립터에 접근하지 못하게 해놨거든요.
제 생각에는 제가 pipe를 잘못 사용하고 있는 것 같은데요.
close와 dup을 어느 때 사용해야 하는지 영 헷갈리네요.
고수님들의 도움 부탁드립니다.
좋은 하루 보내세요.
Forums:
..
a() 에서는 되는데 b()에서는 안된다면 분명 잘못 설계하신 부분이 있을텐데
위의 글만 가지고는 알수 없겠네요.
직접 적인 원인이라고는 생각치 않지만
위의 fork()할때마다 pid[i]값을 즉시 체크해 주신건가요?
혹시 for 루프 밖에서 pid[i]값을 체크하셨다면.
자식 프로세스 3개가 아니라..
자식의 자식이 꼬리를 물고..여러개가 생길수도 있겠네요.
아 예 for문 밖에서 체크를 하긴 하는데요...
^^ 답변해 주셔서 감사합니다.
일단 프로세스 아이디를 for문 밖에서 체크하긴 하는데요.
ps -af로 체크해 보면..프로세스가 마구 늘지는 않는 답니다...^^;
gdb에서 확인을 해보면
처음에 값을 100으로 초기화 했을 경우...
a()함수에서는 제대로 100으로 파일 디스크립터로부터 읽어 오는데요.
b()함수에서는 000으로 읽혀져 오네요.
물론 다른 프로세스 pid[1], pid[2]에서도 같은 함수 a(), b()를 실행시키지만
세마포어를 이용하기 때문에 동시에 여러개의 a() 또는 b()가 실행되지는 못하거든요.
그 순간에는 어떤 프로세서에 있는 하나의 a()만 실행이 되는 것이죠.
아고 모르겠습니다.
파이프로 세마포를 쥐어 패고 싶을 뿐입니다...ㅠㅠ
수고하세요.
댓글 달기