大学时老师让做作业,让实现pstree的功能,最后通过扫描/proc目录完成,现在贴出来分享一下。
程序源码如下
#include #include #include typedef struct pro_info { int pid; int ppid; char name[100]; int flag;//标志是否打印 int rec;//计算总父进程个数 }info; //返回所有数字目录 int filter(const struct dirent *dir){ //select number folder int i; int n = strlen(dir->d_name); for(i = 0;id_name[i]))//返回所有数字目录 return 0; else return 1; } } //得到pid int my_getpid(char * str) { int length=strlen(str); char num[10]; int i,j,ret; if(strncmp(str,"Pid",3)==0) { for(i=0;i='0'&&str[i]<='9') break; }//获得str[i]中第一个数字位的i值 for(j=0;j='0'&&str[i]<='9') break; } //printf("len=%d,i=%d/n",len,i); for(j=0;j0) printf("├──%s(%d)/n",proc[i].name,proc[i].pid); print_tree(proc,total,proc[i].pid,proc[i].rec); } } } //main int main() { struct dirent **namelist; int k,ppid,pid,s1,s2,j; char pid_path[20],str[100],name[100]; info proc[1024]; int i=0,t=0; FILE *fp; int total=scandir("/proc",&namelist,filter,alphasort);//调用filter选择目录名为数字的目录 if(total<0) { printf("scandir erorr !!!"); } else printf("共有进程:%d/n",total); printf("===================================/n"); for(i=0;id_name); strcat(pid_path,"/status"); fp=fopen(pid_path,"r"); while(!feof(fp))//feof()函数读取文件,如果文件到达结尾,就返回非0值 { fgets(str,1024,fp); if((s1=my_getpid(str))!=-1) pid=s1; if((s2=my_getppid(str))!=-1) ppid=s2; if(strncmp(str,"Name",4)==0)//原理于my_getppid()相同 { for(j=4;j='a'&&str[j]<='z') break; } for(k=j;kflag,0,total);//将proc.flag的所有字节初始化为0 memset(&proc->rec,0,total); print_tree(proc,total,0,0);//打印进程树 }
其中主要用到了scandir函数,看一下其用法
函数作用:读取特定的目录数据
表头文件:#include
定义函数:int scandir(const char *dir, struct dirent **namelist, nt (*select) (const struct dirent *), nt (*compar) (const struct dirent **, const struct dirent**));
函数说明:scandir()会扫描参数dir指定的目录文件,经由参数select指定的函数来挑选目录结构至参数namelist数组中,最后再调用
参数compar指定的函数来排序namelist 数组中的目录数据。每次从目录文件中读取一个目录结构后便将此结构传给参数select所指的
函数, select函数若不想要将此目录结构复制到namelist数组就返回0,若select为空指针则代表选择所有的目录结构。scandir()会
调用 qsort()来排序数据,参数compar则为qsort()的参数,若是要排列目录名称字母则可使用alphasort(). 结构dirent定义请参考
readdir()
返回值 :成功则返回复制到namelist数组中的数据结构数目,有错误发生则返回-1
错误代码:ENOMEM 核心内存不足
Example:
/* print files in current directory in reverse order */ #include main() { struct dirent **namelist; int n; n = scandir(".", &namelist, 0, alphasort); if (n < 0) perror("scandir"); else { while(n--) { printf("%s/n", namelist[n]->d_name); free(namelist[n]); } free(namelist); } }