대화형 응용프로그램을 작성하다보니 터미널 설정까지 봐야하는 일이 생겼다.
프로그램을 일반적으로 수행한 것인지 쉘스크립트에서 스크립팅 용도로 수행한 것인지 구별할 방법이 필요했다.
예를 들면 쉘 스크립트로 아래와 같이 작성했을 때이다.

#!/bin/bash
./tcgetattr << EOF
EOF

일반 적으로 수행 되었을 때는 프롬프트를 띄우고 싶었고, 스크립팅일 경우에는 프롬프트를 띄우기 싫었다. 그래서 어떤 환경인지 구분할 무언가가 필요했는데 tcgetattr 함수를 이용하니 해결이 가능했다.
리눅스 환경에서 어떤 프로그램이 수행될 때 /proc/[PID]/fd 경로를 보면 대충 아래와 같이 파일이 생성된다.

$ ll
합계 0
dr-x------ 2 fhan smrf  0 2015-04-10 18:29 ./
dr-xr-xr-x 8 fhan smrf  0 2015-04-10 13:02 ../
lrwx------ 1 fhan smrf 64 2015-04-10 18:29 0 -> /dev/pts/0
lrwx------ 1 fhan smrf 64 2015-04-10 18:29 1 -> /dev/pts/0
lrwx------ 1 fhan smrf 64 2015-04-10 18:29 2 -> /dev/pts/0

위에서 보는 바와 같이 0번(stdin), 1번(stdout), 2번(stderr)이 모두 /dev/pts라는 장치로 연결되어있다.
하지만 스크립팅을 통해 수행을 한다면 다르다.  아래와 같이 0번(stdin)이 /tmp/에 생성된 파일로 연결되어있다.

$ ll
합계 0
dr-x------ 2 fhan smrf  0 2015-04-10 18:34 ./
dr-xr-xr-x 8 fhan smrf  0 2015-04-10 18:34 ../
lr-x------ 1 fhan smrf 64 2015-04-10 18:34 0 -> /tmp/sh-thd-1428667350 (deleted)
lrwx------ 1 fhan smrf 64 2015-04-10 18:34 1 -> /dev/pts/0
lrwx------ 1 fhan smrf 64 2015-04-10 18:34 2 -> /dev/pts/0

이렇게 /proc 경로를 확인해보는 방법을 선택할 수도 있겠지만 이쁘지 않다. 이 때, tcgetattr 함수를 사용하면 분별할 수 있는 값을 알려준다.

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

int main()
{
    int rc=0;
    struct termios t;
    rc = tcgetattr( 0, &t );
    printf("[%d] FLAG=[%d]\n", rc, t.c_iflag);
    return 0;
}

수행 결과는 아래와 같다.

$ ./tcgetattr
[0] FLAG=[1280]

$ sh tcgetattr.sh
[-1] FLAG=[419322856]

tcgetattr 함수의 리턴값을 이용하면 간단하다.