1.要求显示指定路径下的所有文件的属性
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<string.h>
#include<stdlib.h>
#include<grp.h>
#include<time.h>
#include<dirent.h>
#include<errno.h>
//文件类型及权限
int get_mode(mode_t m,char* per){
int i=0,j=0;
for(i=8;i>=0;i--)
{
if((m & (1<<i))== 0)
{
per[j++]='-';
continue;
}
int res=i%3;
switch(res)
{
case 2:
per[j++]='r';
break;
case 1:
per[j++]='w';
break;
case 0:
per[j++]='x';
break;
}
}
}
int get_time(time_t t)
{
struct tm *info = NULL;
info = localtime(&t);
printf("%d %02d %02d:%02d ",\
info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min);
fflush(stdout);
return 0;
}
int 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?\n"); break;
}
return 0;
}
int get_username(uid_t uid)
{
struct passwd* pwd =getpwuid(uid);
if(NULL == pwd)
{
printf("failed\n");
return -1;
}
printf("%s",pwd->pw_name);
return 0;
}
int lsline(struct dirent* rp)
{
struct stat buf;
if(stat(rp->d_name,&buf)<0)
{
perror("stat");
return -1;
}
//文件类型及权限
char per[10]="";
get_fileType(buf.st_mode);
get_mode(buf.st_mode,per);
printf("%s ",per);
//硬连接数
printf("%ld ",buf.st_nlink);
//文件所属用户
get_username(buf.st_uid);
//所属组用户
getgrgid(buf.st_gid);
struct group* grp=getgrgid(buf.st_gid);
if(NULL == grp)
{
printf("fetgrgid failed\n");
return -1;
}
printf(" %s ",grp->gr_name);
//文件大小
printf("%ld ",buf.st_size);
//创建日期
get_time(buf.st_ctime);
printf("%s\n",rp->d_name);
return 0;
}
int main(int argc, const char *argv[])
{
//获取文件属性
// struct stat buf;
DIR* dp = opendir(argv[1]);
if(NULL == dp)
{
perror("opendir");
return -1;
}
struct dirent* rp =NULL;
while(1)
{
rp = readdir(dp);
if(NULL == rp)
{
if(0 == errno)
{
printf("目录读取完毕\n");
break;
}else
{
perror("readdir");
return -1;
}
}
if(rp->d_name[0]=='.')
continue;
char s[20]="";
char ss[20]="";
strcpy(s,argv[1]);
strcpy(ss,rp->d_name);
strcat(s,ss);
strcpy(rp->d_name,s);
//printf("%s",rp->d_name);
lsline(rp);
//printf("%s\n",rp->d_name);
}
closedir(dp);
return 0;
}
2.要求用父子进程拷贝—张图片,子进程先拷贝后半部分,父进程后拷贝前半部分。
a.提示:用lseek, stat获取文件大小
b.父进程起始位置:0~size/2子进程起始位置size/2~sizec.读一个字节,写一个字节
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
void copy_file(int fileSize,int fd_r,int fd_w)
{
char buf[10]="";
int cpyCount=0;
ssize_t res =0;
while(1)
{
bzero(buf,sizeof(buf));
if(fileSize>sizeof(buf))
{
cpyCount =sizeof(buf);
}else
{
cpyCount=fileSize;
}
fileSize=cpyCount;
res =read(fd_r,buf,cpyCount);
/* if(res<0)
{
perror("read");
return -1;
}
else if(res=0)
{
break;
}*/
}
}
int main( int argc, const char *argv[])
{
//以读的方式打开1.png
int fd_r = open( "./1.png",O_RDONLY);
if(fd_r <0)
{
perror( "open1" );
return -1;
}
//以写的方式打开2.png
int fd_w =open( "./2.png", O_WRONLY|O_CREAT|O_TRUNC,0777);
if(fd_w <0)
{
perror( "open2" );
return-1;
}
struct stat buf;
off_t size = lseek(fd_r, 0, SEEK_END);
int flag=size%2;
pid_t pid;
pid =fork();//创建一个子进程
if(pid>0)
{
//父进程执行
sleep(1);
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
copy_file(size/2,fd_r,fd_w);
printf("完成1/2-->\n");
}else if(0==pid)
{
//子进程执行
lseek(fd_r,size/2,SEEK_SET);
lseek(fd_w,size/2,SEEK_SET);
copy_file(size/2+flag,fd_r,fd_w);
printf("完成2/2-->\n");
}
close(fd_r);
close(fd_w);
return 0;
}