作业一
//作业一
//使文件I0函数,拷贝-张图片,父进程拷贝前半部分,子进程拷后半部分
//提示:
//1.一个进程拷贝完毕后再开始另外一个进程。
//2.父好进程格自各自的文件。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
int main(){
pid_t pid =fork();
//父进程和子进程都会获取该图片的文件描述符
int fd_r=open("./pic.png",O_RDONLY);//获取文件描述符
if(fd_r<0){
perror("open");
return -1;
}
//求源文件大小
off_t size_r =lseek(fd_r,0,SEEK_END);
//获取文件中间位置
off_t flag;
if(size_r%2==0){
flag = size_r/2;
}else{
flag = size_r/2+1;
}
//打开目标文件
int fd_w = open("./pic4.png",O_WRONLY|O_CREAT|O_TRUNC,0775);
if(fd_w<0){
perror("open");
return -1;
}
char c=0;//保存每次读取的字符
size_t res1=0;//接收read(fd_r, , )的返回值
size_t res2=0;//接收read(fd_w, , )的返回值
//父进程拷贝前半部分
if(pid>0){
int *wstatus=NULL;
wait(wstatus);
lseek(fd_r,0,SEEK_SET);//光标移至源文件开始位置
lseek(fd_w,0,SEEK_SET);//光标移至目标文件开始位置
for(int i=0;i<flag;i++){
res1=read(fd_r,&c,1);//读取字符
if(res1<0){
perror("read");
return -1;
}
res2 =write(fd_w,&c,res1);
if(res2<0){
perror("write");
return -1;
}
}
printf("前半部分拷贝完毕\n");
}else if(pid == 0){
lseek(fd_r,size_r/2,SEEK_SET);
lseek(fd_w,size_r/2,SEEK_SET);
for(int i=0;i<flag;i++){
res1 =read(fd_r,&c,1);
if(res1<0){
perror("read");
return -1;
}
res2=write(fd_w,&c,1);
if(res2<0){
perror("write");
return -1;
}
}
printf("后半部分拷贝完毕\n");
exit(1);
}else{
perror("fork");
return -1;
}
//关闭文件
if(close(fd_r)<0){
perror("close");
return -1;
}
if(close(fd_w)<0){
perror("close");
return -1;
}
return 0;
}
作业二 验证运行到waitpid非阻塞形式时,若子进程没退出,则子进程会不会变成僵尸进程
作业三
创建孤儿进程
创建僵尸进程