7月3日作业

发布于:2025-07-04 ⋅ 阅读:(15) ⋅ 点赞:(0)

思维导图


牛客网


一、创建一个分支线程,在主线程中拷贝文件的前一部分,主线程拷贝文件的后一部分

代码

#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次