day4 IO进程 C语言

作业:
任务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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值