Linux System Programming Linux Environment Programming Kongju National University Linux System Programming 1/27
Linux System Programming Contents Shell에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용 User information 구하기 Host computer information 구하기 System Error Logging 작성 및 환경 설정 Kongju National University Linux System Programming 2/27
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 Kongju National University Linux System Programming 3/27
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]); } Kongju National University Linux System Programming 4/27
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 Kongju National University Linux System Programming 5/27
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]); Kongju National University Linux System Programming 6/27
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가 있다는 것을 표시 Kongju National University Linux System Programming 7/27
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 Kongju National University Linux System Programming 8/27
Linux System Programming time() 기준시간 부터 현재 시간까지 초단위로 반환 #include <time.h> time_t time(time_t *tloc); tloc: null pointer경우 time()에서 return #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); } Kongju National University Linux System Programming 9/27
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 적용여부*/ } Kongju National University Linux System Programming 10/27
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); } Kongju National University Linux System Programming 11/27
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)) Kongju National University Linux System Programming 12/27
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))); } Kongju National University Linux System Programming 13/27
3. Temporary file handling 프로그램 동작중 임시 파일 생성 계산의 중간 결과을 임시 보관 위험한 동작을 수행하기 전 파일의 사본을 저장 단점 임시 파일은 multi-tasking 환경에서 다른 프로세스에 의해 사용되어 질 수 있다. 이는 구별되어 지는 독특한 이름으로 지정되어야 함. Kongju National University Linux System Programming 14/27
Linux System Programming tmpnam(), tmpfile() #include <stdio.h> char *tmpnam(char *s); FILE *tmpfile(void); tmpnam()은 기존 임시파일과 다른 유효한 이름을 반환 string s가 null이 아니라면 s에 의해 전달 string s의 최대 길이는 L_tmpnam tmpnam()을 이용하는 최대 호출 횟수는 한 프로그램에서 TMP_MAX tmpfile()함수는 임시파일 stream pointer를 반환하며, “w+”로 fopen()으로 읽기와 쓰기가 가능한 형태로 open tmpfile()이 실패할 경우 errno를 전달 Kongju National University Linux System Programming 15/27
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"); } Kongju National University Linux System Programming 16/27
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() Kongju National University Linux System Programming 17/27
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 반환 Kongju National University Linux System Programming 18/27
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 */ } Kongju National University Linux System Programming 19/27
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", } Kongju National University Linux System Programming 20/27
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 */ } Kongju National University Linux System Programming 21/27
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); Kongju National University Linux System Programming 22/27
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() Kongju National University Linux System Programming 23/27
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 : 일반적인 error LOG_WARNING : 경고 LOG_NOTICE : 주의 LOG_INFO : 단순 정보 LOG_DEBUG : 시스템 debug message Kongju National University Linux System Programming 24/27
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 를 볼 수 있음 Kongju National University Linux System Programming 25/27
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에 연결되는 string facility: loggin의 기본 동작 값(default는 LOG_USER) logopt: loggin의 동작 환경 LOG_PID: 프로세스 번호를 logging LOG_CONS:logging을 할 수 없을 경우 console로 출력 LOG_ODELAY:syslog() 처음 호출부터 logging LOG_NDELAY:syslog()에 즉시 logging logmask(): log message의 우선순위를 위한 log mask 설정 LOG_MASK(priority) 혹은 LOG_UPTO(priority) macro 이용 Kongju National University Linux System Programming 26/27
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 Kongju National University Linux System Programming 27/27