27
Linux Environment Programming

Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

Embed Size (px)

Citation preview

Page 1: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

Linux EnvironmentProgramming

Page 2: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

Contents

Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용 User information 구하기 Host computer information 구하기 System Error Logging 작성 및 환경 설정

Page 3: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

1. Parameter Transfer

C 언어로 작성된 프로그램은 main() 부터 시작 외부의 인수 전달은 main() 함수의 전달 인수로

입력main(int argc, char *argv[])

ex: % mypro left right “and center”

argc=4 argv={“mypro”, “left”, “right”, “and center”}

Parameter : option(-) , argument

Page 4: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

argc,argv[] 의 parsing

#include <stdio.h>

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]);

}

}

Page 5: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

getopt()

main() 의 파라메터 parsing 을 하는 함수#include <unistd.h>extern char *optarg;extern int optind, opterr, optopt;int getopt(int argc,char const *argv[],const char *optstring);

getopt(): 더 이상 처리할 파라메터가 없을 때 – 1 return optstring: option 을 표현하는 문자의 목록 . “:” 으로 option 에 따르는 value 가 있음을 표시 argument: option 에 따르는 value, 외부변수 optarg 의 의해 전달 특별한 option “--” 는 따르는 value 가 없음 optopt: 지정된 option 이외 option 형식의 입력이 있을 때 “ ?” 를 반환하고 optopt 에 그 value 를 전달 option 이 따르는 value 를 요구함에도 value 가 없을 때 getopt() 는 “:” 를 전달 외부변수 optind 는 다음 처리할 argv 의 index

Page 6: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

getopt() 의 예

#include <stdio.h>#include <unistd.h>main(int argc, char *argv[]){ int opt; while((opt = getopt(argc, argv, "if:lr")) != -1) { switch(opt) { case 'i': /* option */ case 'l': /* option */ case 'r': printf("option: %c\n", opt); break; case 'f': /* option with argument */ printf("filename: %s\n", optarg); break; case ':': /* can’t get argument */ printf("option needs a value\n"); break; case '?': printf("unknown option: %c\n", optopt); break; } } for(; optind < argc; optind++) printf("argument: %s\n", argv[optind]);}

Page 7: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

getopt() 의 동작의 예

% gcc –o argopt argopt.c% ./argopt –i –lr ‘hi ther’ –f fred.c –q option: i option: l option: r filename: fred.c argopt: illegal invalid option –q unknown option: q argument: hi there

*optstring if:lr 에서 f: 는 – f 다음에 argument value 가 있다는 것을 표시

Page 8: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

2. Time & Date in system

Unix/Linux 시스템은 1970 년 1 월 1 일 GMT 0 시 0 분 0 초를 기준 시간으로 지정 (=Epoch time)

MS-DOS 는 1980 년의 기준 , 나머지는 동일

모든 시간은 기준 시간에서 초단위로 계산 32bits 시스템에서는 2038 년에 원점으로 환원 이를 Y2K38 problem, 해결은 그 이전에 32bits 보다 크게

확장 Linux 에서는 long time_t 변수 사용 관련 Header file: /usr/include/time.h

Page 9: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

time()

기준시간 부터 현재 시간까지 초단위로 반환

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

main(){ int i; time_t the_time;

for(i = 1; i <= 10; i++) { the_time = time((time_t *)0); printf("The time is %ld\n", the_time); sleep(2); }}

#include <time.h>time_t time(time_t *tloc);tloc: null pointer 경우 time() 에서 return

Page 10: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

gmtime()

저수준 시간값을 일반적인 구조체로 변환 기능#include <time.h>struct tm *gmtime(const time_t timeval);struct tm {

int tm_sec /*0-59 까지의 초 */ int tm_min /*0-59 까지의 분 */ int tm_hour /*0-23 까지의 시 */ int tm_mday /*1-31 까지의 일 */ int tm_mon /*0-11 까지의 월 ,1 월은 0*/ int tm_year /*1900 이후의 년 */ int tm_wday /*0-6 까지의 요일 , 월요일은 0*/ int tm_yday /*0-365 까지의 날짜 */ int tm_isdst /*0-60 까지의 초 */ int tm_sec /* 일광절약 daylight saving time 적용여부 */

}

Page 11: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

gmtime()

#include <time.h>#include <stdio.h>

main(){ struct tm *tm_ptr; time_t the_time;

(void) time(&the_time); tm_ptr = gmtime(&the_time);

printf("Raw time is %ld\n", the_time); printf("gmtime gives:\n"); printf("date: %02d/%02d/%02d\n", tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday); printf("time: %02d:%02d:%02d\n", tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); }

Page 12: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

localtime(),asctime(),ctime()

#include <time.h>struct tm *localtime(const time_t *timeval);char *asctime(const struct tm *timeptr);char *ctime(const time_t *timeval);

localtime() 은 time_t 형의 값인 GMT 시간을 시스템에 설정된 지역시간 ( 한국은 KST) 과 일광절약 시간제로 변환asctime() 함수는 struct tm 의 값을 ASCII string 으로 값을 변환하여 전달 . 길이는 26 으로 고정ctime() 은 local time 으로 변환한 뒤 이를 asctime() 을 동작시킨 것과 동일 즉 ctime(timeval)=asctime(localtime(timeval))

Page 13: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

localtime(),asctime(),ctime() 의 예#include <time.h>#include <stdio.h>

main(){ time_t timeval;

(void)time(&timeval); printf("The date is: %s", ctime(&timeval)); printf("The date is: %s", asctime(localtime(&timeval)));

}

Page 14: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

3. Temporary file handling

프로그램 동작중 임시 파일 생성 계산의 중간 결과을 임시 보관 위험한 동작을 수행하기 전 파일의 사본을 저장

단점 임시 파일은 multi-tasking 환경에서 다른 프로세스에 의해

사용되어 질 수 있다 . 이는 구별되어 지는 독특한 이름으로 지정되어야 함 .

Page 15: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

tmpnam(), tmpfile()

#include <stdio.h>

char *tmpnam(char *s);FILE *tmpfile(void);

tmpnam() 은 기존 임시파일과 다른 유효한 이름을 반환 string s 가 null 이 아니라면 s 에 의해 전달string s 의 최대 길이는 L_tmpnamtmpnam() 을 이용하는 최대 호출 횟수는 한 프로그램에서 TMP_MAX

tmpfile() 함수는 임시파일 stream pointer 를 반환하며 , “w+” 로 fopen() 으로 읽기와 쓰기가 가능한 형태로 opentmpfile() 이 실패할 경우 errno 를 전달

Page 16: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

tmpnam(),tmpfile() 의 예#include <stdio.h>

main(){ char tmpname[L_tmpnam]; char *filename; FILE *tmpfp;

filename = tmpnam(tmpname);

printf("Temporary file name is: %s\n", filename);

tmpfp = tmpfile(); if(tmpfp) printf("Opened a temporary file OK\n"); else perror("tmpfile"); }

Page 17: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

4. User Information

UID : 사용자 식별자 확인 사용자 정보는 /etc/passwd file 을 기준 ( 확인 요 !) 현재 Linux 시스템은 password 를 shadowing /etc/passwd , /etc/shadow 형식은 /usr/include/sys/type.h 의 typedef struct

uid_t

관련함수 getuid() getlogin() getpwuid() getpwnam()

Page 18: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

getuid(), getlogin()

#include <sys/types.h>#include <unistd.h>

uid_t getuid(viod);char *getlogin(void);

getuid() 는 실행중인 프로그램의 User 의 uid 반환getlogin() 실행중인 프로그램의 login name 반환

Page 19: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

getpwuid(), getpwnam()

#include <sys/types.h>#include <pwd.h>

struct passwd *getpwuid(uid_t uid);struct passwd *getpwnam(const char *name);

struct passwd {char *pw_name /* user login name */uid_t pw_uid /* UID numnber */gid_t pw_gid /* GID number */char *pw_dir /* user home directory $HOME */char *pw_shell /* user’s shell */

}

Page 20: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

getuid(),getlogin(),getpwuid()…

#include <sys/types.h>#include <pwd.h>#include <stdio.h>#include <unistd.h>

main(){ uid_t uid; gid_t gid; struct passwd *pw;

uid = getuid(); gid = getgid();

printf("User is %s\n", getlogin()); printf("User IDs: uid=%d, gid=%d\n", uid, gid);

pw = getpwuid(uid); printf("UID passwd entry:\n name=%s, uid=%d, gid=%d, home=%s, shell=%s\n", pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);

pw = getpwnam("root"); printf("root passwd entry:\n"); printf("name=%s, uid=%d, gid=%d, home=%s, shell=%s\n", pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell); }

Page 21: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

5. Host compuer information

프로그램이 실행중인 computer 에 대한 정보#include <unistd.h>int gethostname(char *name,size_t namelen);

#include <sys/utsname.h>int uname(struct utsname *name);

gethostname(): name 에 실행중인 computer 의 이름 반환 return value : 0(success), -1(fail)struct utsname {

char sysname[] /* OS name */char nodename[] /* host computer name */char release /* system release number */char version /* system version number */char machine /* status of system hardware */

}

Page 22: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

gethostname(),uname()

#include <sys/utsname.h>#include <unistd.h>#include <stdio.h>

main(){ char computer[256]; struct utsname uts;

if(gethostname(computer, 255) != 0 || uname(&uts) < 0) { fprintf(stderr, "Could not get host information\n"); exit(1); }

printf("Computer host name is %s\n", computer); printf("System is %s on %s hardware\n", uts.sysname, uts.machine); printf("Nodename is %s\n", uts.nodename); printf("Version is %s, %s\n", uts.release, uts.version);}

Page 23: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

6. System Error Logging

Logging : 에러메시지 , 동작과정의 기록 /usr/adm, /var/log : system-wide logging

*/var/log/message /etc/syslog.conf : system-wide log 에 대한 설정 log 보기 : %dmesg , %last , %lastcom

User Error log on user’s file 사용자 프로그램에서 별도 log 를 관리하는 것은 file 을

생성하여 별도 관리 : fopen(), fprintf() 사용

system error logging 중요함수 syslog() openlog() closelog() setlogmask()

Page 24: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

syslog() : system-wide log

#include <syslog.h>void syslog(int priority,const char *message, argument . . . );

syslog(): 로그 기능에 로그 메시지 전달 return value : 0(success), -1(fail)priority:log level, 메시지의 중요도

LOG_USER: 사용자에 의한 생성system 생성 LOG 일경우 아래의 log level

LOG_EMERG : 비상사태 , 모든 사용자에게 전달LOG_ALERT : 높은 정도의 상태 , 운영자에게 전달

* 이하 로그파일에 기록LOG_CRIT : hardware failure 등의 치명적인 error, LOG_ERR : 일반적인 errorLOG_WARNING : 경고LOG_NOTICE : 주의LOG_INFO : 단순 정보LOG_DEBUG : 시스템 debug message

Page 25: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

syslog()

#include <syslog.h>#include <stdio.h>

main(){ FILE *f;

f = fopen("not_here","r"); /* 존재하지 않는 파일 - 열기 당연 error*/ if(!f) syslog(LOG_ERR|LOG_USER,"oops - %m\n");}

화면에 error message 는 출력되지 않는다/var/log/messages file 의 마지막 줄에

Sept …….. tilde syslog:oops – No such file or directory를 볼 수 있음

Page 26: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

Log 환경 설정 함수

#include <syslog.h>void openlog(const char *ident, int logopt, int facility);void closelog(void);int selogmask(int maskpri);

ident: log message 에 연결되는 stringfacility: loggin 의 기본 동작 값 (default 는 LOG_USER)logopt: loggin 의 동작 환경

LOG_PID: 프로세스 번호를 loggingLOG_CONS:logging 을 할 수 없을 경우 console 로 출력LOG_ODELAY:syslog() 처음 호출부터 loggingLOG_NDELAY:syslog() 에 즉시 logging

logmask(): log message 의 우선순위를 위한 log mask 설정LOG_MASK(priority) 혹은 LOG_UPTO(priority) macro 이용

Page 27: Linux Environment Programming. © Private propriraty, do not copyLinux System Programming Contents Shell 에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용

© Private propriraty, do not copy Linux System Programming

openlog(),closelog(),logmask()

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

main(){ int logmask;

openlog("logmask", LOG_PID|LOG_CONS, LOG_USER); syslog(LOG_INFO,"informative message, pid = %d", getpid()); syslog(LOG_DEBUG,"debug message, should appear"); logmask = setlogmask(LOG_UPTO(LOG_NOTICE)); syslog(LOG_DEBUG,"debug message, should not appear"); }

화면에 error message 는 출력되지 않는다/var/log/messages file 의 마지막 줄에Sept . . . tilde logmask[195]:informative message,pid=…/var/log/debug file 의 마지막줄에Sept . . . tilde logmask[195]: debug message, should not appear