쉘에서의 시그널 처리 명령어 trap에 관하여..

 C에서는 시그널 발생시 해당 시그널을 처리하게끔 만들어주는 함수로 raise()가 있다.

 쉘 프로그래밍에서도 이와 비슷한 기능을 하는 명령어가 있는데 ‘trap’이다.

 trap을 이용하여 실행할 명령어와 처리하고자 하는 시그널을 지정해주면 된다. 만일 실행할 명령어를 지정하지 않고 처리할 시그널을 지정하면 해당 시그널은 무시하는 것으로 처리된다.

 trap 명령어의 간단한 사용예를 보면 다음과 같다. 다음의 경우는 INT시그널(SIGINT와 동일)이 발생하면 명령1과 명령2가 자동으로 실행되도록 지정한 것이다.

 trap “명령1; 명령2” INT

 trap 명령을 수행하면서 지정할 수 있는 시그널의 종류를 확인하려면 shell 상에서 kill -l 명령을 실행하면 된다. 그러면 다음과 같이 쉘에서 처리할 수 있는 시그널의 종류가 화면에 디스플레이 된다.

popen() 함수 설명

1장. popen(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

프로세스 I/O


1.1절. 사용법

#include <stdio.h>

FILE *popen(const char *command, const char *type);
int pclose();

1.2절. 설명

popen 은 command 를 shell을 가동시켜서 열고 pipe(2)로 연결한다.
pipe 는 기본적으로 단방향으로만 정의 되어 있음으로, 읽기전용 혹은
쓰기전용 으로만 열수 있으며, type 로 정의된다. popen 은
command 를 실행시키고 pip 연결을 위해서 내부적으로 fork() 와 pipe()
를 사용한다.

command 는 실행쉘인 /bin/sh 에 -c 옵션을 사용하여서 전달되게 된다.

pclose(2) 함수는 종료되는 관련 프로세스를 기다리며 wait(2) 가 반환하는
것처럼 명령어의 종료 상태를 반환한다.


1.3절. 반환값

popen 은 실패할경우 NULL 을 반환한다. pclose 는 종료되는
관련 프로세스를 기다리며 명령어의 종료 상태를 반환한다.
에러가 발견될경우 -1 을 리턴한다.


1.4절. 에러

popen 함수는 메모리 할당이 실패한다면, errno 를 설정하지 않는다.

fork()나 pipe()에서 실패했을경우 적당한 errno 를 설정한다.

pclose()는 자식의 상태를 얻을수 없을경우 errno 를 ECHILD 로
설정한다.


1.5절. 예제

#include <stdio.h>

#define MAXLINE 256

int main()
{
FILE *fp;
int state;

char buff[MAXLINE];
fp = popen("ls -al", "r");
if (fp == NULL)
{
perror("erro : ");
exit(0);
}

while(fgets(buff, MAXLINE, fp) != NULL)
{
printf("%s", buff);
}

state = pclose(fp);
printf("state is %dn", state);
}

출처 : joinc.co.kr
-------------------------------------------------------------------------------------------------

popen를 한쪽 방향이 아닌 "rw" 옵션을 사용해서 열기를 시도해서 30분동안 삽질하다가 겨우 발견한 해결방법..


단말기(터미널)와 특성변환

 사용자들은 단말기를 통해 시스템에게 전달하고자 하는 내용을 입력하고 원하는 정보를 출력 받는다. 이때 생각했던 것보다 많은 일들이 발생하는데 단말기에서 발생한 모든 일은 담당 커널이 처리를 한다.

 이때 담당 커널은 소프트웨저거으로 구현된 장치 구동기를 의미하는데 장치 구동기는 단말기 장치와 프로그램 사이의 문자 전송이 주목적인 프로그램이다. 흔히 단말기라고 하면 표준 입출력 장치를 의미하는데 이는 키보드와 모니터를 의미한다. 유닉스 시스템은 이들 표준 입출력 장치도 특수 파일의 하나로 인식하여 처리를 하고 있다.

 /dev 디렉토리 밑에 있는 특수 파일들에는 단말기를 위한 파일이 존재하는데, 예를 들면 다음과 같다.

/dev/tty01
/dev/tty02

 쉘에서는 단말기의 특성을 변경하는 방법을 제공하고 있는데, 이때 사용하는 키워드는 stty이다.

sync()

 유닉스 시스템이 시작되고 필요한 프로그램들을 실행시키고 나면 많은 내용의 디스크 파일 정보들이 시스템 메모리속에 로딩이 되고 변경 및 업데이트가 된다. 이러한 때에 오류가 발생해 시스템에 문제가 생기거나 하면 디스크 속에는 예전 정보만 가지고 있거나 나쁜 경우에는 디스크가 일부 깨지는 문제도 발생할 수 있다.

 이러한 문제들을 방지하려면 가끔 메모리 속의 내용을 디스크로 보내주는 작업이 필요하다. 특별히 시스템의 전원을 내리거나 리부팅을 할 경우에는 더욱 필요한데 이러한 일이 가능하도록 만들어주는 시스템 명령어는 sync이다. 또한 C에서 sync() 함수를 이용하여 이러한 작업을 할 수도 있다.