作业:
任务1:fork前创建一个int a,父子进程中是否都有变量a,虚拟地址是否相同,物理地址是否相同
任务2:fork函数后,在父进程中int b,父子进程中是否都有变量b,虚拟地址是否相同,物理地址是否相同
任务3:fork函数后,在子进程中int c,父子进程中是否都有变量c,虚拟地址是否相同,物理地址是否相同
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
int a = 0;
pid_t child = 0;
child = fork();
int *b = (int *)malloc(sizeof(int));
int c;
if(child == 0){
c = 10;
printf("CHILD:%d\n",getpid());
printf("a = %d,&a = %d\n",a,&a);
printf("b = %d,&b = %d\n",*b,b);
printf("c = %d,&c = %d\n",c,&c);
}else{
a++;
*b = 50;
printf("PARENT:%d\n",getpid());
printf("a = %d,&a = %d\n",a,&a);
printf("b = %d,&b = %d\n",*b,b);
printf("c = %d,&c = %d\n",c,&c);
}
free(b);
b = NULL;
sleep(1);
return 0;
}
作业4:完成ls -l
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
void mode_toString(mode_t mode){
char str[3] = "rwx";
int count = 9;
int c = 0400;
switch (mode & S_IFMT){
case S_IFREG:printf("REG ");break;
case S_IFDIR:printf("DIR ");break;
default:printf("UNK ");break;
}
while(c >= 0001){
if((mode & c) > 0){
putchar(str[count % 3]);
}else{
putchar('-');
}
c = c >> 1;
count--;
}
}
void time_toString(time_t t,char *s){
struct tm *time = localtime(&t);
switch(time->tm_mon){
case 0:strcpy(s,"JAN");break;
case 1:strcpy(s,"FEB");break;
case 2:strcpy(s,"MAR");break;
case 3:strcpy(s,"APR");break;
case 4:strcpy(s,"MAY");break;
case 5:strcpy(s,"JUN");break;
case 6:strcpy(s,"JUL");break;
case 7:strcpy(s,"AUG");break;
case 8:strcpy(s,"SEP");break;
case 9:strcpy(s,"OCT");break;
case 10:strcpy(s,"NOV");break;
case 11:strcpy(s,"DEC");break;
}
}
void my_ls(char *s){
DIR *dir = opendir(s);
if(dir == NULL){
perror("opendir");
return;
}
struct dirent *rd = NULL;
struct stat st;
int total = 0;
while(rd = readdir(dir)){
char file_path[128] = "";
strcat(file_path,s);
printf("%-25s",rd->d_name);
strcat(file_path,rd->d_name);
int status = stat(file_path,&st);
if(status < 0){
perror("stat");
return;
}
struct passwd *pwd = getpwuid(st.st_uid);
struct group *grp = getgrgid(st.st_gid);
printf("%8s %8s ",pwd->pw_name,grp->gr_name);
mode_toString(st.st_mode);
printf("%3ld ",st.st_nlink);
printf("%6ld ",st.st_size);
char month[5] = "";
time_toString(st.st_ctime,month);
printf("%3s",month);
struct tm *time = localtime(&st.st_ctime);
printf(" %02d %02d:%02d",time->tm_mday,time->tm_hour,time->tm_min);
total += st.st_blocks;
puts("");
}
printf("Total:%d\n",total/2);
closedir(dir);
dir = NULL;
}
int main(int argc, const char *argv[])
{
char path[128] = "";
printf("Please enter the directory path:\n");
scanf("%s",path);
my_ls(path);
return 0;
}