任务1:fork前创建一个int a,父子进程中是否都有变量a,虚拟地址是否相同,物理地址是否相同
答:虚拟地址相同,但物理地址不相同。子进程是直接复制父进程的所有资源,用户空间的虚拟地址也是相同,但因为是进程,所以用户空间独立,物理空间随机映射,所以不相同。
任务2:fork函数后,在父进程中int b,父子进程中是否都有变量b,虚拟地址是否相同,物理地址是否相同
答:子进程根本找不到定义的变量,因为进程之间相互独立。
任务3:fork函数后,在子进程中int c,父子进程中是否都有变量c,虚拟地址是否相同,物理地址是否相同
答:父进程根本找不到定义的变量,因为进程之间相互独立。
作业4:完成ls -l
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <strings.h>
char* get_filePermission(mode_t m)
{
static char getPer[10]="";
char per[]="rwx";
for(int i=0;i<=8;i++)
{
if((m&(0400>>i))==0)
{
getPer[i]='-';
continue;
}
getPer[i]=per[i%3];
}
return getPer;
}
void get_fileType(mode_t m)
{
if(S_ISREG(m))
{
putchar('-');
}
else if(S_ISDIR(m))
{
putchar('d');
}
else if(S_ISCHR(m))
{
putchar('c');
}
return;
}
int main(int argc, const char *argv[])
{
DIR *dp = opendir(argv[1]);
if(NULL == dp)
{
perror("opendir");
return -1;
}
int count = 1;
struct dirent* rp = NULL;
int fd;
struct stat buf;
struct tm* info=NULL;
time_t t;
char str[30]="";
while(1)
{
rp = readdir(dp);
if(NULL == rp)
{
if(0 == errno)
{
printf("目录文件读取完毕\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
if((rp->d_name)[0]=='.')
{
continue;
}
strcpy(str,argv[1]);
strcat(str,rp->d_name);
if(stat(str,&buf)<0)
{
perror("stat");
return -1;
}
struct passwd* pwd =getpwuid(buf.st_uid);
struct group* grp =getgrgid(buf.st_gid);
//t=time(NULL);
info=localtime(&buf.st_ctime);
if(NULL==info)
{
perror("localtime");
}
get_fileType(buf.st_mode);
printf("%s ",get_filePermission(buf.st_mode));
printf(" %ld ",buf.st_nlink);
printf(" %s ",pwd->pw_name);
printf(" %s ",grp->gr_name);
printf(" %ld ",buf.st_size);
printf("%d-%02d-%02d %02d:%02d:%02d ",info->tm_year+1900,info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min,info->tm_sec);
printf(" %s\n", rp->d_name);
}
return 0;
}
结果: