利用递归方法打印进程树

/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;
}


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值