一、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <errno.h>
char get_fileType_mode2(mode_t c){
switch(c&S_IFMT){
case S_IFREG:
return '-';
case S_IFDIR:
return 'd';
case S_IFCHR:
return 'c';
case S_IFBLK:
return 'b';
case S_IFIFO:
return 'p';
case S_IFLNK:
return 'l';
case S_IFSOCK:
return 's';
}
}
char get_fileType_mode(mode_t c){
if(S_ISREG(c))
return '-';
else if(S_ISDIR(c))
return 'd';
else if(S_ISCHR(c))
return 'c';
else if(S_ISBLK(c))
return 'b';
else if(S_ISFIFO(c))
return 'p';
else if(S_ISLNK(c))
return 'l';
else if(S_ISSOCK(c))
return 's';
}
void get_mode(mode_t c){
char b[4]="rwx-";
for(int j=0;j<9;j++){
if(c&(0400>>j)){/*
switch (j%3)//看1所在位置
{
case 0://1在0,3,6位
putchar('r');
break;
case 1://1在1,4,7位
putchar('w');
break;
case 2://1在2,5,8位
putchar('x');
break;
}
else putchar('-');
*/
putchar(b[j%3]);
}else{
putchar(b[3]);
}
}
}
char *get_mode2(mode_t m,char *ptr){
char per[]="rwx";
for(int i=0;i<9;i++){
if((m&(0400>>i))==0){
ptr[i]='-';
continue;
}
*(ptr+i)=per[i%3];
}
return ptr;
}
int main(int argc, const char *argv[])
{
DIR *dp=opendir("./");
if(NULL==dp){
perror("opendir");
return -1;
}
struct dirent* readptr=NULL;
if(argc<2){
return -1;
}
int count=0;
while(1){
readptr=readdir(dp);
if(NULL==readptr){
if(0==errno){
printf("目录读取完毕\n");
break;
}else{
perror("readdir\n");
return -1;
}
}
argv[count]=readptr->d_name;
struct stat buf;
time_t t=buf.st_ctime;
struct tm* info=NULL;
time(&t);
info=localtime(&t);
if(stat(argv[count],&buf)<0){
perror("stat");
return -1;
}
char per[10]="";
get_mode2(buf.st_mode,per);
char c=get_fileType_mode(buf.st_mode);
//char m=get_fileType_mode2(buf.st_mode);
//fprintf(stdout,"%c",m);
//get_mode(buf.st_mode);
//putchar('\n');
//if((readptr->d_name)[0]!='.'){
//if(*(readptr->d_name)!='.'){
fprintf(stdout, "%c%s %ld %s %s %6ld%2d月 %02d %02d:%02d %-s\n", c,per,buf.st_nlink,getpwuid(buf.st_uid)->pw_name,\
getgrgid(buf.st_gid)->gr_name,buf.st_size,info->tm_mon+1,\
info->tm_mday,info->tm_hour,info->tm_min,argv[count]);
//}
count++;
}
if(closedir(dp)<0){
perror("closedir");
return -1;
}
return 0;
}
二、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
if(argc<2){
printf("输入错误,请重新输入\n");
return -1;
}
int fp1=open(argv[1],O_RDONLY);
if(fp1<0){
perror("fp1");
return -1;
}
int fp2=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fp2<0){
perror("fp2");
return -1;
}
pid_t cpid=fork();
off_t len=lseek(fp1,0,SEEK_END);
if(cpid>0){//父进程
sleep(1);
lseek(fp1,0,SEEK_SET);
lseek(fp2,0,SEEK_SET);
char buf=0;
for(int i=0;i<len/2;i++){
read(fp1,&buf,1);
write(fp2,&buf,1);
}
}else if(0==cpid){//子进程
lseek(fp1,len/2,SEEK_SET);
lseek(fp2,len/2,SEEK_SET);
char buf1=0;
for(int i=0;i<len/2;i++){
read(fp1,&buf1,1);
write(fp2,&buf1,1);
}
}else{
perror("fork");
return -1;
}
close(fp1);
close(fp2);
return 0;
}