展望现在通过一些OS功能我觉得在POSIX系统中,您有C函数调用想unlink()删除文件,link()创建硬链接的文件,symlink()以创建符号文件,rename()移动文件,但是...这里是一个函数copy()文件?
我知道通常的方法是打开源文件,读取其内容,打开目标文件并将其转储到那里.但是为什么我不能在以前的所有功能中找到任何这样的效用函数?
snf*_*snf 15
我尝试在Linux上的cp命令上运行strace,它实际上打开了两个文件,它从一个文件中读取并以32768字节的块写入另一个文件:
...
stat64("log", {st_mode=S_IFREG|0644, st_size=352, ...}) = 0
stat64("copied", 0xbf99e1c0) = -1 ENOENT (No such file or directory)
open("log", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=352, ...}) = 0
open("copied", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(3, "2012-04-27 22:26:55-0400 [-] Log"..., 32768) = 352
write(4, "2012-04-27 22:26:55-0400 [-] Log"..., 352) = 352
read(3, "", 32768) = 0
close(4) = 0
close(3) = 0
...
Run Code Online (Sandbox Code Playgroud)
所以是的,那里没有cp系统调用.希望它能帮到你.
Fra*_*kH. 15
在谈论"复制文件"时,存在两种语义:
Windows/DOS文件系统传统上没有任何"浅拷贝"机制 - 但UN*X总是以硬链接的形式出现.
因此POSIX/UN*X具有link(2)系统调用 - 以新名称建立对现有"文件数据"的新引用 - 即,执行浅拷贝.
只有存在"快速深层复制"机制时,"深层复制"系统调用才有意义 - 例如,在底层文件系统实现重复数据删除以执行文件级克隆的情况下.
否则,这样的函数必须"降级"(回退)到库实现.
UN*X机制允许某些特定于文件系统的东西ioctl(),即"I/O可扩展性的厨房接收器".有关如何使用此工具(如果可用)复制文件的示例,请参阅此GNU coreutils帖子,其中包含在BTRFS上使用文件克隆的增强请求.
鉴于Windows' CopyFile实际上CopyFileEx没有回调,我强烈怀疑它真的是一个系统调用 ; 这是一个实用功能.对于葡萄酒Windows模拟器,可以检查kernel32.dll的代码实现,发现CopyFileEx在葡萄酒的来源,dlls/kernel32/path.c对于例如如何能做到.根据Microsoft的许可,不允许
拆解/反编译Windows的实际kernel.dll内容,因此我无法合法地断言Windows本身也是如此,即CopyFile用户区实现,而不是系统调用.
在这里再次比较Windows和UN*X ...并非UN*X libc中的所有内容都是系统调用,这就是UN*X联机帮助页区分第2节(sys调用)和第3节(运行时库接口)的原因.对于kernel.dllWindows上的功能也是如此- 其中一些是"直接直通",而另一些则是通过单个系统调用未实现的更复杂的"实用功能" .