프로세스가 죽지를 않아요..

jinushun의 이미지

포크를 시켜서 둘다 특정경우 죽이려 하는데 이놈의 자식놈 -_- 이 죽지를 않네요.
아래는 코드입니다.

	
int c; /*or */ char c;
pid = fork();	
	if (pid > 0)
	{
	   while(1)
	   {
		c = getc(stdin);
		write(fd, &c, 1);
		if(c == 3)
		{
                                                //wait(NULL);
                                                close(fd);
	                	exit(0);
		}
	    }
	}

	if (pid == 0)
	{
		while(1)
		{
		read(fd,&c, 1);
		if(c == 3)
		{
			printf("DEBUG\n\n");
		                close(fd);
			exit(0);
		}
		write(1, &c, 1);
		}
	}

이상인데요..
int c 일때..
ctrl + c 를 누르면 부모 프로세스 는 죽습니다.ps 해보면
자식은 안죽고 살아있어요
wait 를 넣어도 안죽더군요.

DEBUG 가 안찍히고 커서가 한칸 밀리는 걸 봐서 자식의 if 문이 수행이 안됩니다.
왜그런거죠?

근데 웃긴건 char c; 일때는 프로세스가 둘다 죽더군요. 이상합니다.

이때 는 DEBUG 는 찍힙니다.

int 와 char 의 차이인것 같은데.

깊이 있는 공부가 없는 저로서는 -_-;;(학교때 무쟈게 놀았거든요)..

이유가 궁금한데요.

설명좀해주세요 ^^

그럼 수고하십시오

asteroid의 이미지

byte order문제가 아닐까요?

혹시 PowerPC나 Sparc계열에서 돌리신게 아닌지 궁금합니다.

jinushun의 이미지

PC 에서 수행한 작업이에요 ^^

왜그런 거지 ..-_-;;

----------------------------
www.nate.com
----------------------------

cmoh1110의 이미지

자식놈이 계속 읽고 쓰기를 하고 있군요.

자식놈은 읽기만 해야할 거 같습니다. 예를 들어,

자식: read x
부모: write 3
자식: write x

이런 순의 연산이 돼버리면, 부모는 정당한 종료 값을 썼는데 자식놈이 덮어써
버리니깐 계속 x 라는 값을 읽겠죠..

그리고, read/write 를 하게 되면 file descriptor 가 파일내에서 가리키는
위치가 변하니까 부모/자식 공히 한번 루프를 돌때마다 open/close 를 해줘
야 할 거 같구요.

비교할 때에는 c == 3 이 아니라, (unsigned char)c == '3' 으로 ...

추가
--------
생각해보니 asteroid 님 말씀처럼 byte-order 문제도 있겠군요.
파일에 쓰거나 읽을 때는,

int c;
unsigned char uch;
...
uch = (unsigned char)c;
write(fd, &uch, 1);

....
read(fd, &uch, 1);

처럼 해주는 게 좋을 것 같네요.