利用递归方法打印进程树
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;
}
#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;
}
相关文章推荐
- 利用return语句实现方法的递归。
- Node.js利用debug模块打印出调试日志的方法
- 直接利用工具将prn文件打印到打印机的方法
- 利用递归的方法实现字符串倒序
- 利用递归方法求5!
- 利用http组件来实现页面打印的一种方法
- 利用递归方法求5!。
- JAVA利用递归的方法删除一个文件夹以及文件夹下所有的子文件
- [置顶] 利用python实现批量插入打印信息的方法
- java练习——利用方法递归对1~100求和
- 小记:利用递归调用循环寻找MP3文件的方法。
- java语言实现:利用递归方法求n!
- 递归方法和stack消除递归打印目录下的文件夹及文件名
- 利用Math类的方法,打印一个近似圆
- m^n实现,利用递归的方法
- 利用反射打印出 Jar包中所有的类名和方法
- 倒序打印的聪明递归方法~当然也可以使用堆栈法和最简单易懂的循环法
- 利用python打印出菱形、三角形以及矩形的方法实例
- 利用3种不同的方法打印矩阵12345
- 算法题:利用递归方法求n!