作业:
任务1:fork前创建一个int a,父子进程中是否都有变量a,虚拟地址是否相同,物理地址是否相同
任务2:fork函数后,在父进程中int b,父子进程中是否都有变量b,虚拟地址是否相同,物理地址是否相同
任务3:fork函数后,在子进程中int c,父子进程中是否都有变量c,虚拟地址是否相同,物理地址是否相同
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
int main(int argc, const char *argv[])
{
int a=10;
pid_t pid = fork();
printf("pid = %d line = %d\n",pid,__LINE__);
if(pid>0)
{
printf("%p\n",&a);
a=100;
printf("父进程:%d\n",a);
int b;
printf("父进程:%p\n",&b);
}
else if(pid==0)
{
printf("%p\n",&a);
printf("子进程:%d\n",a);
int c;
printf("子进程:%p\n",&c);
}
else if(pid<0)
{
perror("fork");
return -1;
}
fflush(stdout);
while(1)
sleep(1);
return 0;
}
pid = 19792 line = 11
0x7fff2cc99ccc
父进程:100
父进程:0x7fff2cc99cd0
pid = 0 line = 11
0x7fff2cc99ccc
子进程:10
子进程:0x7fff2cc99cd0
任务一:子父进程中都有变量a,虚拟地址相同,物理地址不同;
任务二:父进程中有变量b,子进程没有;
任务三:子进程中有变量c,父进程没有。
作业4:指定路径下的所有文件属性打印出来,类似于ls -l一个指定的目录
ubuntu@ubuntu:~/32/work/io/day4$ cat ls-l.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include<errno.h>
#include<dirent.h>
void get_permision(mode_t mode)
{
for(int i=0;i<9;i++)
{
if((mode & (0400>>i))==0)
{
putchar('-');
continue;
}
switch(i%3)
{
case 0:
putchar('r');
break;
case 1:
putchar('w');
break;
case 2:
putchar('x');
break;
}
}
return;
}
void get_fileType(mode_t m)
{
switch (m & S_IFMT)
{
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFDIR: printf("d"); break;
case S_IFIFO: printf("p"); break;
case S_IFLNK: printf("l"); break;
case S_IFREG: printf("-"); break;
case S_IFSOCK: printf("s"); break;
default: printf("unknown?"); break;
}
return;
}
void show(char *name)
{
struct stat buf;
if(stat(name,&buf)<0)
{
perror("stat");
return;
}
get_fileType(buf.st_mode);
get_permision(buf.st_mode);
struct passwd* pwd = getpwuid(buf.st_uid);
if(NULL==pwd)
{
perror("getpwuid");
return;
}
struct group* grp = getgrgid(buf.st_gid);
if(NULL==grp)
{
perror("getgrgid");
return;
}
printf("\t%ld\t%s\t%s\t%ld\t",buf.st_nlink,pwd->pw_name,grp->gr_name,buf.st_size);
struct tm *time=NULL;
time = localtime(&buf.st_ctime);
printf("%d\t%d\t%d:%d",time->tm_mon+1,time->tm_mday,time->tm_hour,time->tm_min);
return;
}
int main(int argc, const char *argv[])
{
if(argc<=1)
{
printf("请命令行传参:");
return -1;
}
DIR* fp = opendir(argv[1]);
if(NULL==fp)
{
perror("opendir");
return -1;
}
struct dirent* dp=NULL;
while(1)
{
dp = readdir(fp);
if(NULL==dp)
{
if(0==errno)
{
printf("读取完毕\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
show(dp->d_name);
printf("\t%s\n",dp->d_name);
char str[30]="";
strcpy(str,argv[1]);
strcat(str,dp->d_name);
}
closedir(fp);
return 0;
}