1.通过父子进程完成对文件的拷贝(cp),父进程从文件开始到文件的一半开始拷贝,子进程从文件的一半到文件末尾。要求:文件IO cp src d
- 文件长度获取?lseek
- 子进程定位到文件一半的位置 lseek
- 父进程怎么能准确读到文件一半的位置
- fork之前打开文件,父子进程中读写文件时,位置指针是同一个
["code:c"] #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> int main(int argc, char const *argv[]) { pid_t pid; int fd_src, fd_dest; char buf[32] = ""; ssize_t s; if (argc != 3) { printf("format: %s <srcfile> <destfile>\n", argv[0]); return -1; } //打开文件 fd_src = open(argv[1], O_RDONLY); if (fd_src < 0) { perror("src err"); return -1; } fd_dest = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd_dest < 0) { perror("dest err"); return -1; } //计算文件一半长度 off_t len = lseek(fd_src, 0, SEEK_END) / 2; pid = fork(); if (pid < 0) { perror("fork err"); return -1; } else if (pid == 0) //从一半到末尾读写 { printf("child\n"); //将子进程中文件定位到一半 lseek(fd_src, len, SEEK_SET); lseek(fd_dest, len, SEEK_SET); //读写操作 while (1) { if ((s = read(fd_src, buf, 32)) == 0) break; write(fd_dest, buf, s); // sleep(1); } } else //从开头到一半 { printf("parent\n"); wait(NULL); //避免父子进程一起读写共用一个文件指针造成混乱 //定位到文件开头 lseek(fd_src, 0, SEEK_SET); lseek(fd_dest, 0, SEEK_SET); //读写操作,一共读len个 while (len > 0) { if (len > 32) s = read(fd_src, buf, 32); else s = read(fd_src, buf, len); write(fd_dest, buf, s); len -= s; //len代表剩下要读的字符个数,每次减去读到的个数 // sleep(1); } } close(fd_src); close(fd_dest); return 0; }