您的位置:首页 > 其它

利用递归方法打印进程树

2013-05-01 22:36 260 查看
/proc/pid/status下的信息递归打印系统的进程树。

#include<stdio.h>

#include<stdlib.h>

#include<errno.h>

#include<string.h>

#include<sys/types.h>

#include<netdb.h>

#include<pthread.h>

#include<unistd.h>

#include<dirent.h>

char default_path[1024] = "/proc/";

int s = 0;

typedef struct file_info {

int pid;

int ppid;

char name[1024];

int flag;

int rec;

} info;

int my_getpid(char* str){

int len = strlen(str);

char num[10];

int i, j, ret;

if(strncmp(str, "Pid", 3) == 0){

for(i = 0; i < len; i++)

{

if(str[i] >= '0' && str[i] <= '9')

break;

}

for(j = 0; j < len - i; j++)

{

num[j] = str[i + j];

}

num[j] = '\0';

ret = atoi(num);

}

else ret = 0;

return ret;

}

int my_getppid(char *str) {

int len = strlen(str);

char num[10];

int i, j, ret;

if(strncmp(str, "PPid", 4) == 0)

{

for(i = 0; i < len; i++){

if(str[i] >= '0' && str[i] <= '9')

break;

}

for(j = 0; j < len - i; j++){

num[j] = str[i + j];

}

num[j] = '\0';

ret = atoi(num);

}

else

ret = 0;

return ret;

}

void print_pstree(info *file,int count, int ppid, int rec)

{

int i, j, k;

for(i = 0; i < count; i++)

{

if(file[i].flag == 0 && file[i].ppid == ppid)

{

file[i].rec = rec + 1;

file[i].flag = 1;

for(k = 0; k < rec; k++)

{

printf("   ---");

}

printf("%s\n", file[i].name);

print_pstree(file, count, file[i].pid, file[i].rec);

}

}

}

int main(){

int i, j, k, total, s1, s2, count, t;

char str[1024], dir[1024];

struct dirent **namelist;

strcpy(dir, default_path);

total = scandir(dir, &namelist, 0, alphasort);

printf("path = %s, total = %d\n", dir, total);

for(i = 0; i < total; i++)

{

strcpy(str, namelist[i]->d_name);

if(str[0] >= '0' && str[0] <= '9')

count++;

}

printf("process counts is %d\n", count);

info file[1024];

i = 0;

t = 0;

while(i < total)

{

FILE *fp;

char path[1024], name[1024];

int pid,ppid;

strcpy(str, namelist[i]->d_name);

strcpy(path, default_path);

if(str[0] >= '0' && str[0] <= '9')

{

strcat(path, str);

strcat(path, "/status");

fp = fopen(path, "r");

while(!feof(fp))

{

fgets(str, 1024, fp);

if((s1 = my_getpid(str)) != 0)

{

pid = s1;

}

if((s2 = my_getppid(str)) != 0)

ppid = s2;

if(strncmp(str, "Name", 4) == 0)

{

for(j = 4; j < strlen(str); j++)

{

if(str[j] >= 'a' && str[j] <= 'z')

break;

}

for(k = j; k < strlen(str); k++)

{

name[k - j] = str[k];

}

name[k - j] = '\0';

}

file[t].pid = pid;

file[t].ppid = ppid;

strcpy(file[t].name, name);

}

fclose(fp);

t++;

}

i++;

}

int m;

for( m = 0; m < count; m++)

{

file[m].flag = 0;

file[m].rec = 0;

}

print_pstree(file, count, 0, 0);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: