1.用父子进程拷贝一张图片,子进程先拷贝后半部分,父进程拷贝前半部分。
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
void copy2(int fd_r,int fd_w,intstartsize,int endsize)
{
char buf[32]="";
int res=0;
lseek(fd_r,startsize,SEEK_SET);
while(1){
res=read(fd_r,buf,sizeof(buf));
if(res==0){
break;
}
write(fd_w,buf,res);
}
}
void copy1(int fd_r,int fd_w,intstartsize,int endsize)
{
char buf[32]="";
int res=0;
lseek(fd_r,startsize,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
while(1){
res=read(fd_r,buf,sizeof(buf));
if(res==0){
break;
}
write(fd_w,buf,res);
}
}
int main(int argc, const char *argv[])
{
pid_tpid;
intfd_r=open("./love.JPG",O_RDONLY);
int fd_w=open("./2lvoe.JPG",O_WRONLY|O_CREAT,0666);
int num=lseek(fd_r,0,SEEK_END);
pid=fork();
//子进程拷贝后半部分
if(0==pid){
copy2(fd_r,fd_w,num/2+1,num);
close(fd_r);
close(fd_w);
}
//父进程拷贝前半部分
elseif(pid>0){
sleep(1);
copy1(fd_r,fd_w,0,num/2);
close(fd_r);
close(fd_w);
}
elseif(pid<0){
perror("fork");
return-1;
}
return0;
}
2. 要求显示指定路径下的文件属性
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
#include<errno.h>
#include<dirent.h>
#define ERR_MSG(msg) do{\
printf("line:%d\n",__LINE__);\
perror(msg);\
}while(0)
char* get_filePermission(mode_t m,char ptr[10],int size)
{
if(size<10)
{
printf("数组容量必须大于10");
returnNULL;
}
charper[]="rwx";
inti=0;
for(i=0;i<9;i++)
{
if((m&(0400>>i))==0){
ptr[i]='-';
}
else{
ptr[i]=per[i%3];
}
}
returnptr;
}
char* get_fileStyle(mode_t m,char pdr[])
{
if((m&S_IFMT)==S_IFREG){
strcpy(pdr,"-");
}
elseif((m&S_IFMT)==S_IFLNK){
strcpy(pdr,"l");
}
elseif((m&S_IFMT)==S_IFSOCK){
strcpy(pdr,"s");
}
elseif((m&S_IFMT)==S_IFBLK){
strcpy(pdr,"b");
}
elseif((m&S_IFMT)==S_IFDIR){
strcpy(pdr,"d");
}
elseif((m&S_IFMT)==S_IFCHR){
strcpy(pdr,"c");
}
elseif((m&S_IFMT)==S_IFIFO){
strcpy(pdr,"p");
}
returnpdr;
}
char* get_usrname(uid_t uid)
{
staticchar usrname[20]="";
structpasswd* usr=getpwuid(uid);
if(NULL==usr){
returnNULL;
}
strcpy(usrname,usr->pw_name);
returnusrname;
}
char* get_grpname(uid_t gid)
{
staticchar grpname[20]="";
structgroup* gr=getgrgid(gid);
if(NULL==gr)
{
perror("getGrpName");
returnNULL;
}
strcpy(grpname,gr->gr_name);
returngrpname;
}
int main(int argc, const char *argv[])
{
charptr[10]="";
charpdr[2]="";
structstat buf;
structtm* hr;
if(argc!=2){
fprintf(stderr,"需要传参");
return-1;
}
DIR*dp=opendir(argv[1]);
if(NULL==dp){
perror("opendir");
return-1;
}
structdirent* rp=NULL;
while(1){
rp=readdir(dp);
if(NULL==rp){
if(errno==0){
printf("文件读取完毕");
break;
}
else{
perror("readdir");
return-1;
}
}
if(stat(rp->d_name,&buf)<0){
perror("stat");
return-1;
}
get_filePermission(buf.st_mode,ptr,sizeof(ptr));
get_fileStyle(buf.st_mode,pdr);
printf("%s",pdr);
printf("%s\n",ptr);
printf("link=%ld\t",buf.st_nlink);
printf("%s %s\t",get_usrname(buf.st_uid),\
get_grpname(buf.st_gid));
printf("size=%ld",buf.st_size);
hr=localtime(&buf.st_atime);
printf(" %d月%d日 %02d:%02d:%02d",hr->tm_mon+1,hr->tm_mday,\
hr->tm_hour,hr->tm_min,hr->tm_sec);
printf(" %s\n",rp->d_name);
}
}