보통 리눅스에서 프로그램을 설치하거나 업데이트 할 때 yum(나는 보통 '윰'이라 읽었는데, 외국에선 '염'에 가깝게 읽는다더란...)이란 프로그램을 사용했는데...리눅스를 관리할 일이 없다보니 이 툴도 잘 사용하는 편이 아니었다.

이번에 FC22를 설치하고 보니 yum이 dnf로 대체 되었다고 한다.
X환경에서 프로그램 하나 설치하려고 하면 왜이리 힘든지...이제 늙은건지 이리 해보고 저리 해봐도 잘 모르겠다.
gui는 포기하고 쉘환경에서 dnf를 사용해서 설치하기로 했다.

먼저 dnf -y update 통해 설치되어 있는 것들을 최신으로 업데이트 한다.(아마 맞을거다...)
그리고 나서 dnf -y install vim-enhanced 명령으로 vim을 설치한다.

관련 정보는 아래 링크에서 얻었다.

http://www.liquidweb.com/kb/how-to-install-vim-visual-editor-improved-on-fedora-22/

기존에 쓰던 리눅스는 runlevel을 변경하기 위해서 /etc/inittab 파일을 수정해왔다.

id:3:initdefault:

하지만 이번에 설치한 Fedora Core 22에서는 해당 파일에서 runlevel을 변경하는 항목을 찾을 수 없었다.

대신 다른 방법을 사용하라고 알려주신다.

# inittab is no longer used.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target

root 유저로 아래와 같이 명령을 내리니 변경이 되었다.

systemctl set-default multi-user.target

이후 확인해 보면 아래와 같이 변경 된 것을 확인할 수 있다.

변경 전
# ls -al /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 36 10월 14 17:33 /etc/systemd/system/default.target -> /lib/systemd/system/graphical.target

변경 후
# ls -al /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 41 10월 15 13:22 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target

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

#!/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 함수의 리턴값을 이용하면 간단하다.