- 用文件IO函数拷贝一张图片,要求子进程拷贝后半部分,父进程拷贝前半部分。.
-
#include<head.h> int main(int argc, const char *argv[]) { //被复制的图片 int fd1=open(argv[1],O_RDWR); if(fd1<0) { ERR_MSG("open"); } //让写入权限能077 umask(0); //复制的图片 int fd2=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0777); if(fd2<0) { ERR_MSG("open"); } //定义一个字符来进行读取和写入 char a = 0; //成功读到的返回值 ssize_t res=0; //计算图片的大小 off_t size=lseek(fd1,0,SEEK_END); //进行子进程的创建 pid_t cpid=fork(); //判断为子进程来进行拷贝后半段 if(cpid == 0) { //在被复制的图片,把光标移动到一半的位置 lseek(fd1,size/2,SEEK_SET); //在复制的图片,把光标移动到一半的位置 lseek(fd2,size/2,SEEK_SET); while(1) { //循环写入 res=read(fd1,&a,sizeof(a)); //如果返回值为0时返回 if(0 == res) { break; } //循环输出 write(fd2,&a,res); } } //判断为父进程来进行拷贝前半段 if(cpid > 0) { int num = 0; wait(NULL); //从被复制的图片,让光标从0开始,读取到图片一半的位置 lseek(fd1,0,SEEK_SET); //让复制的图片,让光标从0开始,读取到图片一半的位置 lseek(fd2,0,SEEK_SET); //循环 while(1) { //当位置小于一半的时候结束循环 if((size/2) < num) { break; } //循环写入 res=read(fd1,&a,sizeof(a)); //循环输出 write(fd2,&a,res); //判断条件 num++; } } //关闭被复制的图片 if(close(fd1)<0) { ERR_MSG("close"); } //关闭复制的图片 if(close(fd2)<0) { ERR_MSG("close"); } return 0; }
- 若没有子进程wait函数是否阻塞,wait函数是否运行成功.
#include<head.h>
#include<sys/wait.h>
int main(int argc, const char *argv[])
{
for(int i=0;i<5;i++)
{
printf("yesyes");
}
while(1)
{
pid_t wpid=wait(NULL);
printf("%d\n",wpid);
}
return 0;
}
思维导图