Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-20 19:12
관리 메뉴

zyint's blog

[2] 조인시위키: pipe 본문

예전글들

[2] 조인시위키: pipe

진트­ 2008. 4. 18. 00:23

1장 pipe(2)

1.1절. 사용법

#include <unistd.h>
int pipe(int filedes[2]);

1.2절. 설명

pipe 를 이용하면 2개의 파일 지시자를 생성할수 있다. 2개가 생성되는 이유는 읽기전용과 쓰기전용의 파이프를 생성하기 위함이다. filedes[0] 은 읽기 전용, filedes[1] 은 쓰기전용의 파이프로 사용된다.

이들 파이프는 주로 부모프로세스와 자식프로세스간의 통신을 위한 목적으로 사용된다.

 


1.3절. 반환값

성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.

 

1.4절. 에러

EMFILE

너무 많은 파일 디스크립터가 프로세스에 의해 사용되고 있다.

ENFILE

시스템 파일 테이블이 꽉찼을경우

EFAULT

filedes 가 유효하지 못하다.

ENOBUFS

시스템에 연산을 위해서 이용할수 있는 자원이 부족할때

 

1.5절. 예제

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
 int n, fd[2];
 char buf[255];
 int pid;

 if (pipe(fd) < 0)
 {
 perror("pipe error : ");
 exit(0);
 }

 // 파이프를 생성한다. 
if ((pid = fork()) < 0)
 {
 perror("fork error : ");
 exit(0);
 }

 // 만약 자식프로세스라면 파이프에 자신의 PID 정보를 쓴다.
 else if (pid == 0)
 {
 close(fd[0]);
 while(1)
 {
 memset(buf, 0x00, 255);
 sprintf(buf, "Hello : %d\n", getpid());
 write(fd[1], buf, strlen(buf));
 sleep(1);
 }
 }

 // 만약 부모프로세스라면 파이프에서 데이타를 읽어들인다. 
else
 {
 close(fd[1]);
 while(1)
 {
 memset(buf, 0x00, 255);
 n = read(fd[0], buf, 255);
 fprintf(stderr, "%s", buf);
 }
 }
}

위 프로그램은 파이프를 생성한후 만들어진 파이프를 통해서 자식과 부모가 서로 통신하는 예제이다. fork 하기전에 pipe 를 만들면 된다. fork() 는 특성상 열린파일지시자를 자식에게 상속하기 때문이다.

 

 

원문

http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/pipe

 

 

이 글은 스프링노트에서 작성되었습니다.

Comments