'ps'에 해당되는 글 1건

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 */
크리에이티브 커먼즈 라이센스
Creative Commons License
Posted by minzkn

트랙백 주소 :: http://blog.minzkn.com/trackback/73

댓글을 달아 주세요