pipe와 fork관련 기초수준의 질문입니다.(코딩중 에러)

gauri123의 이미지

일단 테스트를 위해 두 부분을 주석처리 하였습니다.

(// 로 된 세줄이 하나이고, /* */ 로 묶인 부분이 또 하나입니다.

이 두 부분을 다 풀고 첫번째 //주석 윗부분의 else {를 지워주면

원본 소스입니다.)

아래 붙인 코드 내용중 주석 처리된 밑의 else if문이 원본이나,

임시로 else { 로 바꾸어 보면 여기까지는 실행이 정상적으로 됩니다.

그런데 이것을 else if로 바꾸면 블럭 안으로 들어가 지는 것은 같은데

정상적인 실행이 안되네요...

(원본 소스를 돌린 결과가

testing one
testing two
testing three

라고 각 블럭내의 printf문이 출력 되기에 들어가 진다는 것을 알았습니다.)

more 라는 글자가 좌측 하단에 뜨고, 엔터를 누를때마다 스크롤 되야 정상

인데 more라는 글자도 좌측 하단에 안뜨고 엔터를 치면 그냥 프롬프트가

다시 뜨는군요.

물론 위에서 적은대로 원본 소스를 돌리면

testing one
testing two
testing three

세개만 나오고, 강제종료 시키지 않으면

엔터를 칠때마다 프롬프트 없이 개행만 계속 이루어 집니다.

제가 아는 지식 한에서는 제대로 짠 것 같은데 원인을 알수가 없네요..

무엇보다 else if 와 else 둘다 블럭내로 들어가 지는데

else 의 경우는 실행이 되고 else if의 경우는 실행이 안되는 이유를

모르겠습니다. 원 프로세스와 부 프로세스의 차이일까요

지금 막 유닉스에서 테스트를 해 보았는데요

유닉스 에서는 잘 돌아 가네요 ㅡㅡ;;;

그리고 유닉스에서는

execlp의 more와 sort만 바꾸어 주었더니

리눅스에서 상기의 에러와 같은 현상이...

도저히 짐작이 안가요 ㅠ.ㅠ.............

이게 어떤 일인지...


           ls | more | sort 의 효과를 내는 프로그램.




#include <stdio.h>
#include <fcntl.h>

main() {
		int i, LMpipe_io[2], MSpipe_io[2];
		
		pipe(LMpipe_io);  
		pipe(MSpipe_io);

		if(fork() == 0) {
                printf("testing one\n");
				dup2(LMpipe_io[1],1);
				close(LMpipe_io[0]);
				execlp("ls","ls","-l",0);
		}


		else { /

//		else if(fork() == 0) {
                printf("testing two\n");
				dup2(LMpipe_io[0],0);
                close(LMpipe_io[1]);
//				dup2(MSpipe_io[1],1);
//				close(MSpipe_io[0]);
				execlp("more","more",0);
		}
/*
		else  {
                printf("testing three\n");
				dup2(MSpipe_io[0],0);
				close(MSpipe_io[1]);
				execlp("/bin/sort","sort",0);
		}
				
		printf(" testing four\n");	
				
		for(i=0; i<2; i++) {
				close(LMpipe_io[i]); 
				close(MSpipe_io[i]);
		}
*/
		
}

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.