思维导图
牛客网
一、创建一个分支线程,在主线程中拷贝文件的前一部分,主线程拷贝文件的后一部分
代码
#include <25041head.h>
int fd_r,fd_w;
void *callback(void *arg)
{
//分支线程
//打开要拷贝的文件
char buf;
off_t size_q=*(off_t*)arg;
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
for(off_t i=0;i<size_q/2;i++)
{
size_t res=read(fd_r,&buf,1);
if(res==-1)
{
printf("read error..\n");
return NULL;
}
write(fd_w,&buf,1);
}
printf("前半部分拷贝完成\n");
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
fd_r=open("./my.bmp",O_RDONLY);
fd_w=open("./copy_my.bmp",O_RDWR | O_CREAT | O_TRUNC ,0777);
if(-1==fd_r || -1==fd_w)
{
ERRLOG("open error..");
}
char buf;
off_t size=lseek(fd_r,0,SEEK_END);
lseek(fd_r,0,SEEK_SET);
//1.创建线程
pthread_t threadid;
if(0!=(errno=pthread_create(&threadid,NULL,callback,&size)))
{
ERRLOG("pthread_create error..");
}
//等待子线程拷贝完前半部分
pthread_join(threadid,NULL);
lseek(fd_r,size/2,SEEK_SET);
lseek(fd_w,size/2,SEEK_SET);
for(off_t i=size/2;i<size;i++)
{
size_t res=read(fd_r,&buf,1);
if(res==-1)
{
ERRLOG("read error..");
}
write(fd_w,&buf,1);
}
printf("后半部分拷贝完成\n");
//关闭文件
if(-1==close(fd_w) || -1==close(fd_r))
{
ERRLOG("close error..");
}
printf("文件已完成拷贝\n");
return 0;
}
运行结果
二、解读代码
2. 程序代码如下,请按执行顺序写出输出结果 (5 分)
int main()
{
pid_t pid1,pid2;
if((pid1=fork()) == 0)
{
printf("info1 from child process_1\n");
sleep(1);
printf("info2 from child process_1");
_exit(0);
}
else
{
if((pid2=fork()) == 0)
{
sleep(4);
printf("info1 from child process_2");
fflush(stderr);
_exit(0);
}
else
{
wait(NULL);
printf("info1 from parent process\n");
exit(0);
}
}
}
info1 from child process_1
info1 from parent process
三 、 解读代码
- 打印多少次
for(int i=0;i<3;i++)
{
fork()
printf("-")
}
14次