1 #include <stdio.h> 2 #include <string.h> 3 #include <dirent.h> 4 #include <limits.h> 5 #include <unistd.h> 6 #include <sys/stat.h> 7 #include <sys/types.h> 8 #include <fcntl.h> 9 10 #define PROC "/proc/" 11 12 13 typedef int Myfunc(int pid) ; 14 static Myfunc myfunc; 15 16 17 #define P() printf("%s:%d ",__FUNCTION__,__LINE__) 18 static int dopath(Myfunc *func); 19 20 int main(int argc,char *argv[]) 21 { 22 return dopath(myfunc); 23 } 24 static int 25 dopath(Myfunc *func) 26 { 27 //struct stat statbuf; 28 struct dirent *dirp; 29 DIR *dp; 30 int ret; 31 char *ptr; 32 33 //if() 34 if((dp = opendir(PROC)) == NULL) 35 { 36 perror("open"); 37 return -1; 38 } 39 40 while((dirp = readdir(dp)) != NULL) 41 { 42 if(strcmp(dirp->d_name,".") == 0 ||strcmp(dirp->d_name,"..")==0) 43 { 44 continue; 45 } 46 int pid = atoi(dirp->d_name); 47 //printf("pid =%d ",pid); 48 if(pid == 0) 49 { 50 continue; 51 } 52 int ret = myfunc(pid); 53 if(ret != 0) 54 { 55 printf("parse error! "); 56 return -1; 57 } 58 } 59 if(closedir(dp) < 0) 60 { 61 printf("cant't close directory /proc"); 62 return -1; 63 } 64 return 0; 65 } 66 static int 67 myfunc(int pid) 68 { 69 char path[128]={0}; 70 const char *name="Name:"; 71 const char *state = "State:"; 72 char pname[32] = {0}; 73 74 sprintf(path,"/proc/%d/status",pid); 75 if(access(path,F_OK)!=0) 76 { 77 printf("%s not exist. ",path); 78 return -1; 79 } 80 81 int fd = open(path,O_RDONLY); 82 if(fd<0) 83 { 84 perror("open"); 85 return -1; 86 } 87 88 char buf[1024]={0}; 89 int length = read(fd,buf,sizeof(buf)); 90 if(length<0) 91 { 92 perror("read"); 93 close(fd); 94 return -1; 95 } 96 char *p0 =strstr(buf,name); 97 char *p1 =strstr(buf,state); 98 memcpy(pname,p0+strlen(name)+1,p1-p0-strlen(name)-2); 99 printf("pname:%s ",pname); 100 101 102 103 close(fd); 104 105 return 0; 106 }
写几行代码来打印pid对应的进程名。
java版本:
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.Reader; 8 9 /** 10 * @author jevan (jevan.cnblogs.com) 11 * @version 1.0 at 2013-11-27 12 * 13 */ 14 public class PrintPID { 15 16 /** 17 * @param args 18 */ 19 public static void main(String[] args) { 20 printPid(); 21 } 22 23 private static void printPid() 24 { 25 26 File proc = new File("/proc"); 27 for(File f:proc.listFiles()) 28 { 29 if(f.getName().equals(".")||f.getName().equals("..")) 30 continue; 31 32 if(f.isDirectory()) 33 { 34 int pid = toInt(f.getName()); 35 if(pid == 0) 36 continue; 37 38 File fname = new File("/proc/"+f.getName()+"/status"); 39 40 if(!fname.exists()) 41 continue; 42 43 44 String line0 =read0Line("/proc/"+f.getName()+"/status"); 45 46 String[] tmp = line0.split(":",2); 47 if(tmp==null||tmp.length!=2) 48 { 49 continue; 50 } 51 p("==>"+tmp[1]); 52 53 } 54 } 55 } 56 57 public static void p(String msg) 58 { 59 System.out.println(msg); 60 } 61 62 public static String read0Line(String filePath) 63 { 64 FileInputStream fis = null; 65 try { 66 fis = new FileInputStream(filePath); 67 } catch (FileNotFoundException e) { 68 e.printStackTrace(); 69 } 70 if(fis == null) 71 { 72 return null; 73 } 74 BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); 75 try { 76 String line0 = reader.readLine(); 77 //p(line0); 78 return line0; 79 } catch (IOException e) { 80 e.printStackTrace(); 81 }finally{ 82 try { 83 reader.close(); 84 fis.close(); 85 } catch (Exception e2) { 86 } 87 } 88 return null; 89 } 90 91 public static int toInt(String str) 92 { 93 int ret = 0; 94 try{ 95 ret = Integer.valueOf(str); 96 }catch(Exception e) 97 { 98 ret = 0; 99 } 100 return ret; 101 } 102 103 }
执行:
1 [jevan@media pname]$ time java PrintPID 2 3 real 0m0.150s 4 user 0m0.098s 5 sys 0m0.056s 6 [jevan@media pname]$ time ./dir 7 8 real 0m0.019s 9 user 0m0.000s 10 sys 0m0.005s 11 [jevan@media pname]$