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

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);

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.