2009년 3월 4일 수요일

5Day Study

5Day Study
[[[[[리눅스(Linux) 환경(environment)]]]]]
프로그램 인자
main은 암시적으로 반환값은 int임
main() = int main(int arc, char *argv[])

프로그램 인자값 표시 예제:
#include < stdio.h>
int main(int argc, char *argv[])
{
int arg;

for(arg = 0; arg < argc; arg++)
{
if(argv[arg][0] == '-')
printf("option: %s\n", argv[arg]+1);
else
printf("argument %d: %s\n", arg, argv[arg]);
}
exit(0);
}

결과는
$ ./args -i -lr 'hi there' -f fred.c
argment 0: args
option: i
option: lr
argument 3: ya there
option: f
argument 5: fred.c

getopt => 리눅스 arg값의 가이드라인을 지킬 수 있도록 도와주는 함수(반환값: 더 이상 처리할 옵션이 없을 때 -1, 인식할 수 없는 옵션의 경우 ?)
#include < unistd.h>
int getopt(int argc, char *const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
POSIX 명세에는 opterr 변수가 0이 아니면 getopt는 에러 메시지를 stderr에 출력한다고 나와있다

getopt 예: 214페이지 참조

getopt_long => 이중 대시로 시작하는 소위 긴 인자를 받아들임(GNU C)
$ ./longopt --initialize

putenv => 환경변수 넣기(반환값: -1 실패)(환경변수는 지역적인 변수임으로 다른 쉘에는 적용이 안됨)
#include < stdlib.h>
char *getenv(const char *name);
getenv => 환경변수 반환(반환값: Null 존재안함)
int putenv(const char *string);

getenv와 putenv 예: 218페이지 참조

environ => 환경값을 문자배열로 사용
#include < stdlib.h>
extern char **environ;

environ 변수를 사용하여 환경 변수를 출력하는 프로그램 예:
#include < stdlib.h>
#include < stdio.h>
extern char **environ;
int main()
{
char **env = environ;

while(*env)
{
printf("%s\n", *env);
env++;
}
exit(0);
}

time_t => 시간과 날짜 함수(long)
#include < time.h>
time_t time(time_t *tloc);

time_t 예: 223페이지 참조

difftime => 두개의 시간 값 사이의 차를 게산하고 부동 소수점 숫자로 반환
#include < time.h>
double difftime(time_t time1, time_t time2);

gmtime => 저수준 시간 값을 좀더 평범한 필드를 포함하는 구조체로 분리
#include < time.h>
struct tm *gmtime(const time_t timeval);

tm 구조체와 gmtime를 이용하여 현재 시간과 날짜를 출력 예: 225페이지 참조

localtime => 지역 시간 보기
#include < time.h>
struct tm *localtime(const time_t *timeval);

mktime => tm 구조체를 원시 time_t 값으로 변환(반환값: -1 실패)
#include < time.h>
time_t mktime(struct tm *timeptr);

asctime => 사람에게 친숙한 시간과 날짜 구하기
#include < time.h>
char *asctime(const struct tm *timeptr);

ctime => 원시 시간 값을 받아들여 좀더 읽기 쉬운 지역 시간으로 반환
char *ctime(const time_t *timevarl);

ctime 예:
#inlcude < time.h>
#include < stdio.h>
int main()
{
time_t timeval;
(void)time(&timeval);
printf("The date is:%s", ctime(%timeval));
exit(0);
}
결과는
The date is: Sat Feb 8 09:21:17 2003

strftime => 시간과 날짜 문자열의 형식으로 더욱 정확하게 제어할 때(반환값 포인터)
#include < time.h>
#define _XOPEN_SOURCE
char *strptime(const char *buf , const char *format, struct tm *timeptr);
strftime을 이용한 예(시간값 구하는 함수 중에는 가장 좋다): 230페이지 참조

tmpnam => 임시 파일 만들기(문자열 *s가 널이아니면 파일 이름을 저장)
#include < stdio.h>
char *tmpnam(char *s);

tmpfile => 임시 파일의 이름을 만듦과 동시에 열기(반환값: Null 에러)
#include < stdio.h>
FILE *tmpfile(void);

tmpnam과 tmpfile의 예: 233페이지 참조

mktemp => tmpnam와 유사하고 사용자가 임시 파일의 위치와 이름을 좀더 제어(유닉스 예전버전에서 지원)
#include < stdlib.h>
char *mktemp(char *template);
mkstemp => tmpfile와 유사하고 사용자가 임시 파일의 위치와 이름을 좀더 제어(유닉스 예전버전에서 지원)
int mkstemp(char *template);

getuid => 프로그램과 연관된 UID를 반환
#include < sys/types.h>
#include < unistd.h>
uid_t getuid(void);

getlogin => 현재 상요자와 연관된 로그인 이름을 반환
char *getlogin(void);

/etc/passwd의 구성은
사용자 이름:암호화된 패스워드:사용자 식별자(UID):그룹 식별자(GID):전체 이름:홈 디레고리:기본 쉘
예: root:x:0:0:root:/root:/bin/bash
/etc/shadow => 암호화된 패스워드 파일

getpwuid => 사용자 정보를 표현하는 passwd 구조체로 UID로 사용자 식별
#include < sys/types.h>
#include < pwd.h>
struct passwd *getpwuid(uid_t uid);
getpwnam => 사용자 정보를 표현하는 passwd 구조체로로그인 이름으로 사용자 식별
struct passwd *getpwnam(const char *name);

사용자 정보 예: 236페이지 참조

getpwent => 전체 각 사용자 정보 항목을 차례대로 반환(반환값: 아무것도 없다 Null)
endpwent => getpwent 처리 종료
setpwent => 패스워드 파일에서 위치를 처음으로 설정
위 3개의 함수들은 디렉토리 스캔 함수인 opendir, readdir, closedir과 유사하게 작동함
#include < sys/types.h>
#include < unistd.h>
uid_t geteuid(void);
gid_t getgid(void);
gid_t getegid)void);
int setuid(uid_t uid);
int setgid(gid_t gid);

gethostname => 시스템의 네트워크 이름(호스트 정보)을 갖어 옴(반환값: 성공 0, 실패 -1)
#include < unistd.h>
int gethostname(char *name, size_t namelen);

uname => 시스템 호출을 통해 호스트 컴퓨터의 좀더 세부적인 정보를 구함(운영체제, 호스트 이름, 시스템의 출시 수준, 시스템의 버전 번호, 하드웨어 형식)(반환값: 실패 -1)
#include < sys/utsname.h>
int uname(struct utsname *name);
호스트 정보 예: 239페이지 참조

기본 로그 디렉토리 => /usr/adm 또는 /var/log
/var/log/messages => 모든 시스템 메시지 포함
/var/log/mail => 메일 시스템 로그
/var/log/debug => 디버그 메시지
/etc/syslog.conf => 시스템 구성을 확인

syslog => 로그 저장
#include < syslog.h>
void syslog(int priority, const char *message, arguments...);

priority 멤버들
LOG_EMERG : 긴급상황
LOG_ALERT : 데이터베이스 손상과 같은 높은 순위
LOG_CRIT : 하드웨어 고장과 같은 치명적인 에러
LOG_ERR : 에러
LOG_WARNING : 경고
LOG_NOTICE : 주의가 필요한 특별한 조건
LOG_INFO : 정보 메시지
LOG_DEBUG : 디버그 메시지

syslog 예:
#include < syslog.h>
#include < stdio.h>
int main()
{
FILE *f;
f=fopen("not_here","r");
if(!f)
syslog(LOG_ERR|LOG_USER,"opps - %m\n");
exit(0);
}

결과
/var/log/messages 마지막 줄에
Feb 8 09:59:14 beast syslog: opps - No such file or directory

openlog => 로그 메시지가 나타나는 방식을 변경
#include < syslog.h>
void openlog(const char *ident, int logopt, int facility);

closelog => openlog를 닫아줌
void closelog(void);

setlogmask => 로그 마스크ㅡ를 설정하여 우선순위 수준을 제어
int setlogmask(int maskpri);

logmask 예:
#include < syslog.h>
#include < stdio.h>
#include < unistd.h>
int main()
{
int logmask;
openlog("logmask", LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO, "infomative message, pid=%d", getpid());
syslog(LOG_DEBUG, "debug message, should appear");
logmask = setlogmask(LOG_NOTICE)); < = NOTICE 이하 우선순위는 무시
syslog(LOG_DEBUG, "debug message, should not appear"); < = 위 마스크 기능 때문에 표시가 안됨
exit(0);
}

결과는
/var/log/messages 끝에
Feb 8 10:00:50 beast logmask[1833]: informative message, pid = 1833
/var/log/debug 끝에
Feb 8 10:00:50 beast logmask[1833]: debug message, should appear

!!중요!!
혹시 /var/log/debug에 로그가 출력되지 않는다면 /etc/syslog.conf 밑에
*.debug /ar/log/debug
를 추가하자

getpid => PID 반환
#include < sys/types.h>
#include < unistd.h>
pid_t getpid(void);

gettpid => 부모 PID 반환
pid_t getppid(void);

getpriority => 자신 또는 다른 응용프로그램 우선순위를 받아오기
#include < sys/resource.h>
int getpriority(int which, id_t who);

setpriority => 자신 또는 다른 응용프로그램 우선순위를 설정하기
int setpriority(int which, id_t who, int priority);

getrlimit => 시스템 리소스의 제한을 받아오기
int getrlimit(int resource, struct rlimit *r_limit);

setrlimit => 시스템 리소스의 제한을 설정하기
int setrlimt(int resource, const struct rlimit *r_limit);

int getrusage => CPU 정보를 받아옴
int getrusage(int who, struct rusage *r_usage);

리소스 제한 예: 251페이지 참조

댓글 없음:

댓글 쓰기