UNIX의 ps 명령을 흉내낸 예제입니다.
| 코드: |
|
/* Copyright (c) 2002 Information Equipment co.,LTD. All Right Reserved. Code by JaeHyuk Cho <minzkn@infoeq.co.kr> This example !!! - Simple is best. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <dirent.h> #include <ctype.h> static int MZ_ps_LoadFile(char *s_FileName, void **s_Buffer) { int s_Return = (-1), s_Handle, s_Length; *(s_Buffer) = (void *)0; s_Handle = open(s_FileName, O_RDONLY); if(s_Handle >= 0) { s_Length = 32 << 10; *(s_Buffer) = (void *)malloc(s_Length); if(*(s_Buffer))s_Return = read(s_Handle, *(s_Buffer), s_Length); else fprintf(stderr, "Not enough memory !!!\n"); close(s_Handle); } else fprintf(stderr, "Can not open file \"%s\" !!!\n", s_FileName); return(s_Return); } static void MZ_ps(void) { char *s_ProcDirectory = "/proc"; DIR *s_Directory; struct dirent *s_DirectoryEntry; char s_TempPath[32]; s_Directory = opendir(s_ProcDirectory); if(s_Directory) { fprintf(stdout, "%5s %5s %5s %5s %s\n", "PPID", "PID", "UID", "State", "Name"); do { s_DirectoryEntry = readdir(s_Directory); if(s_DirectoryEntry) { void *s_Buffer, *s_Ptr; int s_Length; char s_Name[16]; int s_State, s_PID, s_PPID, s_UID; if(isdigit(*((char *)(s_DirectoryEntry->d_name))) == 0)continue; s_Name[0] = s_Name[15] = '\0'; s_State = '?'; s_PID = (-1); s_PPID = (-1); s_UID = (-1); sprintf(&s_TempPath[0], "%s/%s/status", s_ProcDirectory, (char *)s_DirectoryEntry->d_name); s_Length = MZ_ps_LoadFile(&s_TempPath[0], &s_Buffer); if(s_Length > 0 && s_Buffer) { s_Ptr = strstr(s_Buffer, "Name:"); if(s_Ptr)sscanf(s_Ptr, "Name:\t%15s", &s_Name[0]); s_Ptr = strstr(s_Buffer, "State:"); if(s_Ptr)sscanf(s_Ptr, "State:\t%c", (char *)&s_State); s_Ptr = strstr(s_Buffer, "Pid:"); if(s_Ptr)sscanf(s_Ptr, "Pid:\t%d", &s_PID); s_Ptr = strstr(s_Buffer, "PPid:"); if(s_Ptr)sscanf(s_Ptr, "PPid:\t%d", &s_PPID); s_Ptr = strstr(s_Buffer, "Uid:"); if(s_Ptr)sscanf(s_Ptr, "Uid:\t%d", &s_UID); free(s_Buffer); } sprintf(&s_TempPath[0], "%s/%s/cmdline", s_ProcDirectory, (char *)s_DirectoryEntry->d_name); s_Length = MZ_ps_LoadFile(&s_TempPath[0], &s_Buffer); if(s_Length > 0 && s_Buffer) { fprintf(stdout, "%5d %5d %5d %c %s\n", s_PPID, s_PID, s_UID, s_State, s_Name); free(s_Buffer); } } }while(s_DirectoryEntry); closedir(s_Directory); } else fprintf(stderr, "Can not open directory \"/proc\"\n"); } int main(int s_Argc, char **s_Argv) { fprintf(stdout, "MZ_ps v1.0.0 - Copyright(c)InfoEQ co.,LTD - %s %s\n", __DATE__, __TIME__); fprintf(stdout, "Code by JaeHyuk Cho - <minzkn@infoeq.co.kr>\n\n"); MZ_ps(); return(0); } /* End of source */ |




댓글을 달아 주세요