operatingsystem_linux.cpp

来自「Pegasus is an open-source implementation」· C++ 代码 · 共 950 行 · 第 1/2 页

CPP
950
字号
   Counts the number of sub-directories of /proc that are of the format   to represent processes.  */Boolean OperatingSystem::getNumberOfProcesses(Uint32& numberOfProcesses){   Uint32 count;   DIR *procdir;   struct dirent entry, *result;   regex_t process_pattern_compiled;   const char process_pattern[] = "^[1-9][0-9]*$";   count = 0;   if ((procdir = opendir("/proc")))   {      if (regcomp(&process_pattern_compiled, process_pattern, 0) == 0)      {         while (readdir_r(procdir, &entry, &result) == 0 && result != NULL)         {#if defined (PEGASUS_PLATFORM_LINUX_GENERIC_GNU) && !defined(PEGASUS_OS_LSB)            if (entry.d_type != DT_DIR)               continue;#endif            if (regexec(&process_pattern_compiled, entry.d_name,                        0, NULL, 0) == 0)               count++;         }         regfree(&process_pattern_compiled);      }      closedir(procdir);   }   numberOfProcesses = count;   return true;}/**   getMaxNumberOfProcesses method for Linux implementation of OS Provider   gets information from /proc/sys/kernel/threads-max  */Boolean OperatingSystem::getMaxNumberOfProcesses(Uint32& mMaxProcesses){   //-- prior to 2.4.* kernels, this will not work.  also, this is   //   technically the maximum number of threads allowed; since   //   linux has no notion of kernel-level threads, this is the   //   same as the total number of processes allowed.  should   //   this change, the algorithm will need to change.   Uint32 count;   const char proc_file[] = "/proc/sys/kernel/threads-max";   char buffer[MAXPATHLEN];   struct stat statBuf;   FILE *vf;   count = 0;   if (!stat(proc_file, &statBuf))   {      vf = fopen(proc_file, "r");      if (vf)      {         if (fgets(buffer, MAXPATHLEN, vf) != NULL)            sscanf(buffer, "%u", &count);         fclose(vf);      }    mMaxProcesses = count;    return true;   }   return false;}/**   getTotalSwapSpaceSize method for Linux implementation of OS Provider   Linux doesn't have swap space, so return FALSE  */Boolean OperatingSystem::getTotalSwapSpaceSize(Uint64& mTotalSwapSpaceSize){   const char proc_file[] = "/proc/meminfo";   char buffer[MAXPATHLEN];   struct stat statBuf;   regex_t pattern;   FILE *vf;   mTotalSwapSpaceSize = 0;   if (!stat(proc_file, &statBuf))   {      vf = fopen(proc_file, "r");      if (vf)      {         if (regcomp(&pattern, "^SwapTotal:", 0) == 0)         {            while (fgets(buffer, MAXPATHLEN, vf) != NULL)            {               if (regexec(&pattern, buffer, 0, NULL, 0) == 0)               {                  sscanf(buffer, "SwapTotal: %llu kB", &mTotalSwapSpaceSize);               }            }            regfree(&pattern);         }	 fclose(vf);      }   }   if(mTotalSwapSpaceSize) return true;   else return false;}/** _totalVM method for Linux implementation of OS Provider    Calculates TotalVirtualMemory as the sum of totalSwap    and totalMem.*/Uint64 OperatingSystem::_totalVM(){  Uint64 total;  Uint64 tmp;  total = 0;  if( getTotalSwapSpaceSize(tmp) )  {    total += tmp;  }  if( getTotalVisibleMemorySize(tmp))  {    total += tmp;  }  return total;}/**   getTotalVirtualMemorySize method for Linux implementation of OS Provider   Gets information from SwapTotal in /proc/meminfo  */Boolean OperatingSystem::getTotalVirtualMemorySize(Uint64& total){    total = _totalVM();    if (total) return true;    else return false;   // possible that we had trouble with file}/**   getFreeVirtualMemorySize method for Linux implementation of OS Provider   Gets information from SwapFree in /proc/meminfo  */Boolean OperatingSystem::getFreeVirtualMemory(Uint64& freeVirtualMemory){   const char proc_file[] = "/proc/meminfo";   char buffer[MAXPATHLEN];   struct stat statBuf;   regex_t pattern;   FILE *vf;   freeVirtualMemory = 0;   if (!stat(proc_file, &statBuf))   {      vf = fopen(proc_file, "r");      if (vf)      {         if (regcomp(&pattern, "^SwapFree:", 0) == 0)         {            while (fgets(buffer, MAXPATHLEN, vf) != NULL)            {               if (regexec(&pattern, buffer, 0, NULL, 0) == 0)               {                  sscanf(buffer, "SwapFree: %llu kB", &freeVirtualMemory);               }            }            regfree(&pattern);         }	 fclose(vf);      }      if (freeVirtualMemory) return true;  // did get info      else return false;       // didn't get info   }   return false;}/**   getFreePhysicalMemory method for Linux implementation of OS Provider   Gets information from MemFree in /proc/meminfo  */Boolean OperatingSystem::getFreePhysicalMemory(Uint64& total){   const char proc_file[] = "/proc/meminfo";   char buffer[MAXPATHLEN];   struct stat statBuf;   regex_t pattern;   FILE *vf;   total = 0;   if (!stat(proc_file, &statBuf))   {      vf = fopen(proc_file, "r");      if (vf)      {         if (regcomp(&pattern, "^MemFree:", 0) == 0)         {            while (fgets(buffer, MAXPATHLEN, vf) != NULL)            {               if (regexec(&pattern, buffer, 0, NULL, 0) == 0)               {                  sscanf(buffer, "MemFree: %llu kB", &total);               }            }            regfree(&pattern);         }	 fclose(vf);      }      if (total) return true;  // did get info      else return false;       // didn't get info   }   return false;}/**   getTotalVisibleMemorySize method for Linux implementation of OS Provider   Was returning FreePhysical - correct? diabled it.  */Boolean OperatingSystem::getTotalVisibleMemorySize(Uint64& memory){  Uint64 total;   const char proc_file[] = "/proc/meminfo";   char buffer[MAXPATHLEN];   struct stat statBuf;   regex_t pattern;   FILE *vf;   memory = 0;   if (!stat(proc_file, &statBuf))   {      vf = fopen(proc_file, "r");      if (vf)      {         if (regcomp(&pattern, "^MemTotal:", 0) == 0)         {            while (fgets(buffer, MAXPATHLEN, vf) != NULL)            {               if (regexec(&pattern, buffer, 0, NULL, 0) == 0)               {                  sscanf(buffer, "MemTotal: %llu kB", &memory);               }            }            regfree(&pattern);         }	 fclose(vf);      }   }   return true;}/**   getSizeStoredInPagingFiles method for Linux implementation of OS Provider   Was returning TotalSwap - correct? diabled it.  */Boolean OperatingSystem::getSizeStoredInPagingFiles(Uint64& total){    return false;}/**   getFreeSpaceInPagingFiles method for Linux implementation of OS Provider   Was returning TotalVirtualMemory - correct? diabled it.  */Boolean OperatingSystem::getFreeSpaceInPagingFiles(                                              Uint64& freeSpaceInPagingFiles){    return false;}/**   getMaxProcessMemorySize method for Linux implementation of OS Provider   Gets information from /proc/sys/vm/overcommit_memoryt or returns   TotalVirtualMemory   */Boolean OperatingSystem::getMaxProcessMemorySize(Uint64& maxProcessMemorySize){   Uint32 count;   const char proc_file[] = "/proc/sys/vm/overcommit_memoryt";   char buffer[MAXPATHLEN];   struct stat statBuf;   FILE *vf;   count = 0;   if (!stat(proc_file, &statBuf))   {      vf = fopen(proc_file, "r");      if (vf)      {         if (fgets(buffer, MAXPATHLEN, vf) != NULL)            sscanf(buffer, "%d", &count);         fclose(vf);      }   }   if (count) {      maxProcessMemorySize = count;   }   else {//ATTN-SLC-P3-18-Apr-02: Optimization?  get this once & share      if( ! getTotalSwapSpaceSize(maxProcessMemorySize) )	      return false;   }   return true;} /**   getDistributed method for Linux implementation of OS Provider   Always sets the distributed boolean to FALSE  */Boolean OperatingSystem::getDistributed(Boolean& distributed){    distributed = false;    return true;}/**   getMaxProcsPerUser method for Linux implementation of OS Provider   Retrieves the _SC_CHILD_MAX value from sysconf.  */Boolean OperatingSystem::getMaxProcsPerUser (Uint32& maxProcsPerUser){    return sysconf(_SC_CHILD_MAX);}/**   getSystemUpTime method for Linux implementation of OS Provider   Gets information from /proc/uptime (already in seconds).  */Boolean OperatingSystem::getSystemUpTime(Uint64& mUpTime){   const char *UPTIME_FILE = "/proc/uptime";   FILE *procfile;   char read_buffer[MAXPATHLEN];   long uptime;//ATTN-SLC-P3-18-Apr-02: Optimization?  get this once & share   procfile = fopen(UPTIME_FILE, "r");   if (procfile)   {      if (fgets(read_buffer, MAXPATHLEN, procfile))         if (sscanf(read_buffer, " %lu.", &uptime))         {         mUpTime = uptime;	 fclose(procfile);         return true;         }      fclose(procfile);   }   return false;}/**   getOperatingSystemCapability handles a Pegasus extension of the DMTF defined   CIM_Operating System. This attribute is defined as a string either "64 bit"   or "32 bit". On the Linux side we will determine that by measuring the number   of bytes allocated for pointers because this implementation will change   based on the underlying processor architecture. 32-bit 64-bit... 128-bit  */Boolean OperatingSystem::getOperatingSystemCapability(String& scapability){    char capability[80];    void *ptr;    int ptr_bits;    ptr_bits = 8*sizeof(ptr);    sprintf (capability, "%d bit", ptr_bits);    scapability.assign(capability);    return true;}/**   _reboot method for Linux implementation of OS Provider   Finds executable in /sbin, /usr/bin, or /usr/local/sbin and invokes.   Invokes as via system system call, so have full checking of user's   authorization (already authenticated by CIMOM)   Don't we want to do some additional cleanup before actually   invoking the reboot command?  For example, we know the CIMOM is up   and running.  Perhaps set the OS state to 'Stopping' and do a   graceful shutdown of the CIMOM (at least)?   */Uint32 OperatingSystem::_reboot(){   const char *reboot[] = { "reboot", NULL };   const char *paths[] = { "/sbin", "/usr/sbin", "/usr/local/sbin", NULL };   struct stat sbuf;   String fname;   CString p;   Uint32 result;   result = 1;   for (int ii = 0; paths[ii] != NULL; ii++)   {      for (int jj = 0; reboot[jj]; jj++)      {         fname = paths[ii];         fname.append("/");         fname.append(reboot[jj]);         p = fname.getCString();         if (stat(p, &sbuf) == 0 && (sbuf.st_mode & S_IXUSR))         {            result = 2;            if (system(p) == 0)               result = 0;            return result;         }      }   }   return result;}/**   _shutdown method for Linux implementation of OS Provider   Finds executable in /sbin, /usr/bin, or /usr/local/sbin and invokes.   Invokes as via system system call, so have full checking of user's   authorization (already authenticated by CIMOM)   Don't we want to add some more cleanup - especially since we know   the CIMOM is running - this could cause things to be set into a   'Stopping' state while the OS cleans up before actually invoking   the poweroff command.   */Uint32 OperatingSystem::_shutdown(){   const char *poweroff[] = { "poweroff", NULL };   const char *paths[] = { "/sbin", "/usr/sbin", "/usr/local/sbin", NULL };   struct stat sbuf;   String fname;   CString p;   Uint32 result;   result = 1;   for (int ii = 0; paths[ii] != NULL; ii++)   {      for (int jj = 0; poweroff[jj]; jj++)      {         fname = paths[ii];         fname.append("/");         fname.append(poweroff[jj]);         p = fname.getCString();         if (stat(p, &sbuf) == 0 && (sbuf.st_mode & S_IXUSR))         {            result = 2;            if (system(p) == 0)               result = 0;            return result;         }      }   }   return result;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?