7.3作业

思维导图

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

#include "head.h"

int fd_r, fd_w;
off_t size;
// 用线程函数拷贝文件后半部分
void* copySecondHalf(void* arg) {
    // 将光标偏移到文件中间位置
    if (lseek(fd_r, size / 2, SEEK_SET) == -1) {
        ERRLOG("lseek read error");
    }
    if (lseek(fd_w, size / 2, SEEK_SET) == -1) {
        ERRLOG("lseek write error");
    }
    char buf;
    for (off_t i = size / 2; i < size; i++) {
        if (read(fd_r, &buf, 1) != 1) {
            ERRLOG("read error");
        }
        if (write(fd_w, &buf, 1) != 1) {
            ERRLOG("write error");
        }
    }
    printf("后半部分结束\n");
    pthread_exit(NULL);
}
int main(int argc, const char *argv[]) {
    // 打开一个文件读
    fd_r = open("./my.c", O_RDONLY);
    if (fd_r == -1) {
        ERRLOG("open error");
    }
    // 打开一个文件写
    fd_w = open("./cp_1.c", O_WRONLY | O_CREAT | O_TRUNC, 0777);
    if (fd_w == -1) {
        ERRLOG("open error");
    }
    // 计算文件的大小
    if ((size = lseek(fd_r, 0, SEEK_END)) == -1) {
        ERRLOG("lseek error");
    }
    // 将光标移到开头
    if (lseek(fd_r, 0, SEEK_SET) == -1) {
        ERRLOG("lseek error");
    }
    // 将光标移到开头
    if (lseek(fd_w, 0, SEEK_SET) == -1) {
        ERRLOG("lseek error");
    }
    pthread_t tid;
    // 用线程来拷贝文件后半部分
    if (pthread_create(&tid, NULL, copySecondHalf, NULL) != 0) {
        ERRLOG("pthread_create error");
    }
    char buf;
    for (off_t i = 0; i < size / 2; i++) {
        if (read(fd_r, &buf, 1) != 1) {
            ERRLOG("read error");
        }
        if (write(fd_w, &buf, 1) != 1) {
            ERRLOG("write error");
        }
    }
    printf("前半部分结束...\n");
    // 等待线程结束
    if (pthread_join(tid, NULL) != 0) {
        ERRLOG("pthread_join error");
    }
    close(fd_r);
    close(fd_w);
    return 0;
}
 

结果
info1  from  child  process_1
info2  from  child  process_1
info1  from  child  process_2
info1  from  parent  process

打印  24

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值