思维导图


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

被折叠的 条评论
为什么被折叠?



