1>输入任意路径,将该路径下所有文件的详细信息显示出来,类似ls -l
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <errno.h>
char get_filetype(mode_t m)
{
char c=0;
switch (m & S_IFMT) {
case S_IFBLK: c='b'; break;
case S_IFCHR: c='c'; break;
case S_IFDIR: c='d'; break;
case S_IFIFO: c='p'; break;
case S_IFLNK: c='l'; break;
case S_IFREG: c='-'; break;
case S_IFSOCK: c='s'; break;
}
return c;
}
char* get_filePermission(mode_t m,char ptr[10])
{
char per[]="rwx";
int i;
for(i=0;i<9;i++){
if((m&(0400>>i))==0){
ptr[i]='-';//putchar('-');
continue;
}
ptr[i]=per[i%3];
}
return ptr;
}
int main(int argc, const char *argv[])
{
//检查是否输入路径
if(argc<2){
printf("请输入路径\n");
return -1;
}
//打开文件夹读取
DIR* dp=opendir(argv[1]);
if(NULL==dp){
perror("opendir");
return -1;
}
struct dirent* readptr=NULL;
while(1){
readptr=readdir(dp);
if(NULL==readptr){
//读取完毕 不更新错误码
if(0==errno){
printf("目录读取完毕\n");
break;
}
else{
perror("readdir");
return -1;
}
}
struct stat buf;
char fpn[100]="";//定义字符串存储文件路径
strcpy(fpn,argv[1]);//将目录路径复制到字符串中
strcat(fpn,readptr->d_name);//将文件名连接到文件夹路径后 此时fpn为文件路径
if(stat(fpn,&buf)<0){
perror("stat");
return -1;
}
//文件类型以及文件权限
char type=0;
type=get_filetype(buf.st_mode);
printf("%c",type);
char perm[10]="";
get_filePermission(buf.st_mode,perm);
printf("%s ",perm);
//文件的硬链接数
printf("%ld ",buf.st_nlink);
//文件所属用户
struct passwd* pwd=getpwuid(buf.st_uid);
if(NULL==pwd){
perror("getpwuid");
return -1;
}
printf("%s ",pwd->pw_name);
struct group* grp=getgrgid(buf.st_gid);
if(NULL==grp){
perror("getgrgid");
return -1;
}
printf("%s ",grp->gr_name);
//文件的大小
printf("%10ld ",buf.st_size);
//文件修改的时间
struct tm* info=NULL;
info=localtime(&buf.st_ctime);
printf("%d月 %02d %02d:%02d ",info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min);
//文件名
printf("%s\n",readptr->d_name);
memset(fpn,0,sizeof(fpn));
}
if(closedir(dp)<0){
perror("closedir");
return -1;
}
return 0;
}
2>拷贝一张图片,父进程拷贝前半部分,子进程拷贝后半部分
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
int fd1=open("./02_picture.png",O_RDONLY);
ssize_t offset=lseek(fd1,0,SEEK_END);
if(fd1<0){
perror("openfd1");
return -1;
}
int fd2=open("./fcopy.png",O_RDWR|O_CREAT|O_TRUNC,0777);
if(fd2<0){
perror("openfd2");
return -1;
}
ssize_t res=0;
char buf='0';
//创建一个子进程
pid_t cpid=fork();
if(cpid>0){
lseek(fd1,0,SEEK_SET);
lseek(fd2,0,SEEK_SET);
while(offset/2!=lseek(fd1,0,SEEK_CUR)){
res=read(fd1,&buf,sizeof(buf));
write(fd2,&buf,res);
memset(&buf,0,sizeof(buf));
}
}else if(0==cpid){
sleep(1);
lseek(fd1,offset/2,SEEK_SET);
lseek(fd2,offset/2,SEEK_SET);
while(1){
res=read(fd1,&buf,sizeof(buf));
if(0==res){
printf("copy success\n");
break;
}
write(fd2,&buf,res);
memset(&buf,0,sizeof(buf));
}
}else{
perror("fork");
return -1;
}
sleep(1);
close(fd1);
close(fd2);
return 0;
}