술텀뱅이 블로그

[UNIX 시스템프로그래밍] Terminal 과 연결되 Pipe non block 모드 or check 본문

Language/C

[UNIX 시스템프로그래밍] Terminal 과 연결되 Pipe non block 모드 or check

우럭망둥이 2016. 1. 22. 09:30

pipe 를 사용하다보니 이런 경우가 있드라


경우1) 부모와 자식프로세스 사이에 pipe를 이용한 데이터 교환


경우2) 부모와 자식인데 자식이 Terminal(장치드라이버) 인 경우 데이터 교환



"경우1"  은 그냥 개발자가 sync를 맞춰주면 끝이다. 근데...


"경우2"의 경우 Terminal이 언제 나에게 데이터를 줄지 모른다...


그래서 나는 "경우2"에서 많은 고민을 했다.


read 함수를 nonblock 모드로 사용할까.. 하다가 찾은 방법


ioctl 함수... 장치관리자를 제어할때 쓰는 함수라는데


저함수를 사용하면 PIPE에 몇바이트의 데이터가 남았는지 검사할 수 있다.


즉 로직은 이와 같다.


1. 터미널에 파이프를 이용하여 명령어를 전달(Write) 한다.

2. 터미널은 나에게 어떤 데이터를 줄텐데 데이터가 몇byte인지는 모른다.

3. 이때 ioctl 함수를 이용하여 몇바이트가 pipe에 있는지 검색한다.

4. pipe에 데이터가 없다면 들어올때까지 대기 한다.

5. pipe에 데이터가 들어왔다면 들어온 만큼 read  한다.


pipeRead = 0;
// break 10초
for(i=0 ; i<10 ; i++){
    // pipe 남은 내용 검사
    if(ioctl(child_output_pipe[0], FIONREAD, &pipeRead) != -1){
        if(pipeRead != 0){
            // pipe에 내용이 있으므로 break;
            break;
        }

    } else { // ioctl 함수 오류
        return 50;
    }
    sleep(1);
}

if(pipeRead != 0){
    // totRead 초기화
    totRead = 0;
    // pipeRead는 pipe에서 읽어야할 데이터 양
    while(totRead < pipeRead){

        retval = read(child_output_pipe[0], resultBuffer, BUFFSIZE);
        totRead += (int)retval;

        if(retval <= 0){
            // read 오류
            return 52;
        }

        여기서 작업 수행
    }
} else {
    // pipe에서 읽을 것이 없다면 오류
    return 51;
}


위와 같이 코딩했더니 잘돌아 간다...




Comments