请使用文件IO函数拷贝一张图片
(图片就是普通文件,普通文件怎么拷贝,图片就怎么拷贝)
要求子进程拷贝后半部分,父进程拷贝前半部分。
ps: 是否拷贝成功打开可以打开图形化界面查看,
或者使用diff指令--》diff .png 2.png eog 1.png
#include <myhead.h>
int main(int argc, const char *argv[])
{
int pd_r=open("./cat.jpg",O_RDONLY); //打开读文件
if(pd_r<0){
perror("open");
return -1;
}
//打开写的文件
int pd_w=open("./cat1.jpg",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(pd_w<0)
{
perror("open");
return -1;
}
//获取文件属性 方便计算大小
struct stat buf;
if(stat("./cat.jpg",&buf)<0){
perror("stat");
return -1;
}
//创建子进程
pid_t pid=fork();
if(pid>0){ //父进程
//等待子进程拷贝后半段
//然后重置偏移量插入前半段
wait(NULL);
lseek(pd_r,0,SEEK_SET); //重置偏移量
lseek(pd_w,0,SEEK_SET);
char c; //开始拷贝
for(int i=0;i<buf.st_size;i++){
read(pd_r,&c,sizeof(c));
write(pd_w,&c,sizeof(c));
}
printf("前半部分拷贝完毕\n");
}else if(0==pid){ //子进程
lseek(pd_r,buf.st_size/2,SEEK_SET);
lseek(pd_w,buf.st_size/2,SEEK_SET);
char c;
for(int i=buf.st_size/2;i<buf.st_size;i++){
read(pd_r,&c,sizeof(c));
write(pd_w,&c,sizeof(c));
}
printf("后半部分拷贝完毕\n");
}else if(pid<0){
perror("fork");
return -1;
}
close(pd_r);
close(pd_w);
return 0;
}
孤儿进程
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid=fork();
if(pid>0){ //父进程
for(int i=0;i<1;i++){
printf("this is parent\n");
}
printf("parent 退出\n"); //父进程已经结束
}else if(pid==0){ //子进程
for(int i=0;;i++){
printf("this is child %d %d\n",getpid(),getppid());
sleep(1); //死循环子进程没有结束
}
printf("child 退出\n");
}else if(pid<0){
perror("fork");
return -1;
}
return 0;
}
僵尸进程
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid=fork();
if(pid>0){ //父进程 没有wait回收子进程的内存资源
while(1)
{
sleep(1); //死循环
}
}else if(0==pid){
printf("child:%d %d\n",getpid(),getppid());
exit(0); //子进程结束
}else if(pid<0){
perror("fork");
return -1;
}
return 0;
}