实现pstree命令的程序

#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);//打印进程树 }

 

相关函数:opendir, readdir, alphasort
表头文件:#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 核心内存不足

alphasort(依字母顺序排序目录结构)
相关函数
 scandir,qsort
表头文件
 #include
定义函数
 int alphasort(const struct dirent **a,const struct dirent **b);
函数说明
 alphasort()为scandir()最后调用qsort()函数时传给qsort()作为判断的函数,详细说明请参考scandir()及qsort()。 

你可能感兴趣的:(struct,filter,path,tree,fp,数据结构)