把每一步都解释出来客车和货车同时从甲乙两地相向而行,六小时后客车距离乙地的路程是全程的12.5%,货车超过中点54千米,已知货车每小时比客车慢15千米,求甲乙两地相距多少千米
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/25 16:18:31
把每一步都解释出来客车和货车同时从甲乙两地相向而行,六小时后客车距离乙地的路程是全程的12.5%,货车超过中点54千米,已知货车每小时比客车慢15千米,求甲乙两地相距多少千米
把每一步都解释出来
客车和货车同时从甲乙两地相向而行,六小时后客车距离乙地的路程是全程的12.5%,货车超过中点54千米,已知货车每小时比客车慢15千米,求甲乙两地相距多少千米
把每一步都解释出来客车和货车同时从甲乙两地相向而行,六小时后客车距离乙地的路程是全程的12.5%,货车超过中点54千米,已知货车每小时比客车慢15千米,求甲乙两地相距多少千米
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);
}