2月1日 io进程线程

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值