作业
- 从终端获取一个文件的路径以及名字。 若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹 若该文件不是目录文件,则显示该文件的属性到终端上,类似ls -l这单个文件
- 文件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;
}
结果
思维导图