8月1日 IO DAY 4

作业

  1. 从终端获取一个文件的路径以及名字。                                                                                  若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹        若该文件不是目录文件,则显示该文件的属性到终端上,类似ls -l这单个文件
  2. 文件IO函数实现,拷贝文件。子进程先拷贝后半部分,父进程再拷贝前半部分。允许使用sleep函数。

1.代码

#include <stdio.h>
#include <head.h>

void get_filePermission3(mode_t m)
{
    char buf[] = "rwx";
    //printf("mode: ");
    for (int i = 0; i < 9; i++)
    {
        if ((m & (0400 >> i)) == 0)
        {
            putchar('-');
            continue;
        }
        printf("%c", buf[i % 3]);
    }
    putchar(' ');
}

void get_fileType1(mode_t m)
{
    printf("mode: ");
    if (S_ISREG(m))
    {
        putchar('-');
    }
    else if (S_ISDIR(m))
    {
        putchar('d');
    }
    else if (S_ISCHR(m))
    {
        putchar('c');
    }
    else if (S_ISBLK(m))
    {
        putchar('b');
    }
    else if (S_ISFIFO(m))
    {
        putchar('p');
    }
    else if (S_ISLNK(m))
    {
        putchar('l');
    }
    else if (S_ISSOCK(m))
    {
        putchar('s');
    }

    return;
}

int get_fileuidname(mode_t u)
{
    struct passwd *pwd = getpwuid(u);
    if (NULL == pwd)
    {
        ERR_MSG("getpwuid");
        return -1;
    }
    printf("%s ", pwd -> pw_name);
    return 0;
}

int get_filegidname(mode_t g)
{
    struct group *grp = getgrgid(g);
    if (NULL == grp)
    {
        ERR_MSG("getgrgid");
        return -1;
    }
    printf("%s ", grp -> gr_name);
    return 0;
}

int get_filemsg(char *p)
{
    struct stat buf;
    if (stat(p, &buf) < 0)
    {
        ERR_MSG("stat");
        return -1;
    }
    
    //文件的类型和权限
    //printf("mode: 0%o\n", buf.st_mode);
    get_fileType2(buf.st_mode);
    get_filePermission3(buf.st_mode);

    //文件的硬链接数
    printf("%ld ", buf.st_nlink);

    //文件的所属用户
    //printf("%d ", buf.st_uid);
    get_fileuidname(buf.st_uid);

    //文件的所属组用户
    //printf("%d ", buf.st_gid);
    get_filegidname(buf.st_gid);

    //文件大小
    printf("%ld ", buf.st_size);

    //文件的修改时间
    struct tm *info = NULL;
    info = localtime(&buf.st_ctime);
    printf("%d月 %d %d:%02d ", info -> tm_mon + 1, info -> tm_mday, \
    info -> tm_hour, info -> tm_min);

    //文件的名字
    printf("%s\n", p);
}

int get_dirmsg(char *p, char *q)
{
    struct stat buf;
    if (stat(p, &buf) < 0)
    {
        ERR_MSG("stat");
        return -1;
    }
    
    //文件的类型和权限
    //printf("mode: 0%o\n", buf.st_mode);
    get_fileType2(buf.st_mode);
    get_filePermission3(buf.st_mode);

    //文件的硬链接数
    printf("%ld ", buf.st_nlink);

    //文件的所属用户
    //printf("%d ", buf.st_uid);
    get_fileuidname(buf.st_uid);

    //文件的所属组用户
    //printf("%d ", buf.st_gid);
    get_filegidname(buf.st_gid);

    //文件大小
    printf("%ld ", buf.st_size);

    //文件的修改时间
    struct tm *info = NULL;
    info = localtime(&buf.st_ctime);
    printf("%d月 %d %d:%02d ", info -> tm_mon + 1, info -> tm_mday, \
    info -> tm_hour, info -> tm_min);

    //文件的名字
    printf("%s\n", q);
}

int main(int argc, const char *argv[])
{
    char filename[128] = "";
    scanf("%s", filename);
    DIR *dp = opendir(filename);

	if (NULL == dp)
	{
		ERR_MSG("opendir");
		get_filemsg(filename);
        return -1;
    }
    printf("opendir success\n");

	int i = 0;
	while(1)
	{
		struct dirent *rp = readdir(dp);
		if (NULL == rp)
		{
			if(0 == errno)
			{
				printf("目录读取完毕\n");
				break;
			}
			else
			{
				ERR_MSG("readdir");
				return -1;
			}
		}
        
		if (rp -> d_name[0] != '.')
		{
            char s[128] = "";
            strcat(s, filename);
            strcat(s, "/");
            strcat(s, rp -> d_name);
            //printf("%s\n", s);
            printf("[%d] ", ++i);
            get_dirmsg(s, rp -> d_name);
			//printf("[%d] %s\n", ++i, rp -> d_name);
		}
	}
	
	
	if (closedir(dp) < 0)
	{
		ERR_MSG("closedir");
		return 0;
	}
	printf("closedir success\n");

	return 0;
}

结果

 

 2.代码

#include <stdio.h>
#include <head.h>

int main(int argc, const char *argv[])
{
	int fd_r = open("1.c", O_RDONLY);
	if(fd_r < 0)
	{
		ERR_MSG("open");
		return -1;
	}
	printf("open file1 success\n");

	int size = lseek(fd_r, 0, SEEK_END);
	lseek(fd_r, 0, SEEK_SET);

	int fd_w = open("copy3.c", O_WRONLY | O_CREAT | O_TRUNC, 0664);
	if(fd_w < 0)
	{
		ERR_MSG("open");
		return -1;
	}
	printf("open file2 success\n");
	
	ssize_t res = 0;
	char buf = 0;

	pid_t cpid = fork();
	if (cpid > 0)
	{
		sleep(1);
		lseek(fd_r, 0, SEEK_SET);
		lseek(fd_w, 0, SEEK_SET);
		ssize_t sum = 0;
		while (1)
		{
			buf = 0;
			res = read(fd_r, &buf, sizeof(buf));
			sum = sum + res;
			if (sum == (size / 2 + 1))
			{
				break;
			}
			if (write(fd_w, &buf, res) < 0)
			{
				ERR_MSG("write");
				return -1;
			}
			
		}
		printf("copy success\n");
		if (close(fd_r) < 0)
		{
			ERR_MSG("close");
			return -1;
		}
		printf("close file1 success\n");

		if (close(fd_w) < 0)
		{
			ERR_MSG("close");
			return -1;
		}
		printf("close file2 success\n");
		
		
	}
	else if (cpid == 0)
	{
		// int fd_r = open("1.c", O_RDONLY);
		// if(fd_r < 0)
		// {
		// 	ERR_MSG("open");
		// 	return -1;
		// }
		// printf("open file1 success\n");

		// int size = lseek(fd_r, 0, SEEK_END);
		// lseek(fd_r, 0, SEEK_SET);

		// int fd_w = open("copy3.c", O_WRONLY | O_CREAT | O_TRUNC, 0664);
		// if(fd_w < 0)
		// {
		// 	ERR_MSG("open");
		// 	return -1;
		// }
		// printf("open file2 success\n");
		lseek(fd_r, size / 2, SEEK_SET);
		lseek(fd_w, size / 2, SEEK_SET);

		while (1)
		{
			buf = 0;
			res = read(fd_r, &buf, sizeof(buf));
			if (0 == res)
			{
				break;
			}
			if (write(fd_w, &buf, res) < 0)
			{
				ERR_MSG("write");
				return -1;
			}
			
		}
		printf("copy success\n");
		// if (close(fd_r) < 0)
		// {
		// 	ERR_MSG("close");
		// 	return -1;
		// }
		// printf("close file1 success\n");

		// if (close(fd_w) < 0)
		// {
		// 	ERR_MSG("close");
		// 	return -1;
		// }
		// printf("close file2 success\n");
		sleep(1);
	}
	else
	{
		ERR_MSG("fork");
		return -1;
	}

	
	return 0;
}

结果

 

思维导图

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值