linux高手请进,各位高手帮帮忙,能帮我解释下下面的代码吗,越详细越好,最好每一步都给出解释,谢谢拉!

#include<stdio.h>
#include<dirent.h>
#include<string.h>
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;i<n;i++)
{
if(!isdigit(dir->d_name[i]))
return 0;
}
return 1;

}

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<length;i++)
{
if(str[i]>='0'&&str[i]<='9')
break;
}
for(j=0;j<length-i;j++)
num[j]=str[i+j];
num[j]='\0';
ret=atoi(num);
}
else ret=-1;
return ret;
}

int my_getppid(char *str){
int len=strlen(str);
char num[10];
int i,j,ret;
if(strncmp(str,"PPid",4)==0){
//printf("%s",str);
for(i=0;i<len;i++){
if(str[i]>='0'&&str[i]<='9')
break;
}
//printf("len=%d,i=%d\n",len,i);
for(j=0;j<len-i+1;j++){
num[j]=str[i+j];
}
num[j]='\0';
ret=atoi(num);
//printf("ret=%d\n",ret);
}
else ret=-1;
return ret;
}

void print_tree(info *proc,int total,int ppid,int rec)
{

int i,j,k;
for(i=0;i<total;i++)
{
if(proc[i].flag==0&&proc[i].ppid==ppid)
{
proc[i].rec=rec+1;
proc[i].flag=1;
for(k=0;k<rec;k++)
printf(" ");
if(proc[i].pid>0)
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);
if(total<0)
{
printf("scandir erorr !!!");
}
else printf("共有进程:%d\n",total);
printf("===================================\n");
for(i=0;i<total;i++)
{
strcpy(pid_path,"/proc/");
strcat(pid_path,namelist[i]->d_name);
strcat(pid_path,"/status");
fp=fopen(pid_path,"r");

while(!feof(fp))
{
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)
{
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';
}

proc[i].pid=pid;
proc[i].ppid=ppid;
strcpy(proc[i].name,name);

}
fclose(fp);

proc[i].flag=0;
proc[i].rec=0;
}

print_tree(proc,total,0,0);
}

linux在/proc目录下会为每个进程以他们的进程id(pid)为名字建立一个目录存放关于该进程的信息。其中有个status文件记录了该进程的pid和名字以及其父进程的id(ppid)。
你这个程序就是通过读取这些特殊文件的内容把当前系统中所有运行进程的信息先保存在一张线性表proc[1024]中,然后再通过print_tree()这个函数采用递归的方法把进程树显示出来。
info结构体中的前三个字段分别代表一个进程的pid,ppid和name。后面两个字段是用在print_tree()递归调用中的,flag表示这个进程是否已经被扫描过,而rec则表示当前进程是第几“代”进程。
linux系统中的0号进程是idle进程,当系统没有事情做的时候就执行这个进程;而1号进程是init进程,它是0号进程的子进程。这两个进程是linux在启动时创建的,而且在整个系统运行期间不会退出。之后所有的进程都是在init进程基础上通过fork/clone/vfork克隆出来的。也就是说idle是init的父进程,而init是系统中其他所有进程的祖先。
另:你的这段代码有些问题,通过fgets读出来的文件行是包含行末的回车换行的,所以要把最后一个字符去掉打印出来的格式就对了。
#include<stdio.h>
#include<dirent.h>
#include<string.h>
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; i < n; i++)
{
if(!isdigit(dir->d_name[i]))
{
return 0;
}
}

return 1;
}

int my_getpid(char* str)
{
char num[10];
int i,j,ret;
int length = strlen(str);

if(strncmp(str, "Pid", 3) == 0)
{
for(i = 0; i < length; i++)
{
if((str[i] >= '0') && (str[i] <= '9'))
{
break;
}
}
for(j = 0; j < length - i - 1; j++)
{
num[j] = str[i+j];
}
num[j] = '\0';
ret=atoi(num);
}
else
{
ret=-1;
}

return ret;
}

int my_getppid(char* str)
{
char num[10];
int i,j,ret;
int len=strlen(str);

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 - 1; j++)
{
num[j]=str[i+j];
}
num[j]='\0';
ret=atoi(num);
}
else
{
ret=-1;
}
return ret;
}

void print_tree(info* proc, int total, int ppid, int rec)
{
int i,j,k;

for(i = 0; i < total; i++)
{
if((proc[i].flag == 0) && (proc[i].ppid == ppid))
{
proc[i].rec = rec + 1;
proc[i].flag = 1;
for(k = 0; k < rec; k++)
{
printf(" ");
}
if(proc[i].pid > 0)
{
printf("├——%s(%d)\n",proc[i].name,proc[i].pid);
}
print_tree(proc, total, proc[i].pid, proc[i].rec);
}
}
}

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;
FILE *fp;

int total = scandir("/proc", &namelist, filter, alphasort);
if(total < 0)
{
printf("scandir erorr !!!");
}
else
{
printf("Total number of processes:%d\n",total);
}
printf("===================================\n");

for(i = 0; i < total; i++)
{
strcpy(pid_path, "/proc/");
strcat(pid_path, namelist[i]->d_name);
strcat(pid_path, "/status");
fp=fopen(pid_path, "r");

while(!feof(fp))
{
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)
{
for(j=4;j<strlen(str);j++)
{
if(str[j]>='a'&&str[j]<='z')
{
break;
}
}
for(k=j;k<strlen(str)-1;k++)
{
name[k-j]=str[k];
}
name[k-j]='\0';
}

proc[i].pid = pid;
proc[i].ppid = ppid;
strcpy(proc[i].name,name);
}
fclose(fp);

proc[i].flag = 0;
proc[i].rec = 0;
}

print_tree(proc, total, 0, 0);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-16
大概看了下,好像是输出系统中运行的进程及信息。
第2个回答  2010-11-24
安装时鼠标一定要选择标准三键滚轮鼠标,自动识别的有问题。

要选择 PS/2 接口的!
-----------
你试试运行 setup 能不能启动,里面有一个鼠标设置程序。
很久不用红旗了。不知道他的命令有没有修改。

你看看 /etc/X11/corg.conf 里面的鼠标部分设置,应该 /etc/X11 下面有一个你没装 vmtools 时的备份,把鼠标部分的设置替换回来就行了。

我一般不建议使用 vmtools 。没有什么大的用处……
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
第3个回答  2010-11-16
看不懂呀看不懂,我也是菜鸟,在学
相似回答