Linux系统中的CP命令是拷贝文件或目录的命令,可以用它来从一个目录到另一个目录实现文件的快速复制,也可以使用它备份文件。本文将分析Linux系统CP命令的源代码,以了解其具体实现原理。
CP命令的源代码主要包括以下部分:入口函数,参数解析,处理函数,文件拷贝,文件权限等。在这里我们将具体分析每个部分。
首先,CP命令的源代码入口函数为main函数,用来接收调用CP命令时的参数,函数中定义了三个变量用来存储源文件、目标文件和选项:

int main(int argc, char *argv[]){char src[256], dst[256];intopts;...}
其次,CP命令的源代码会对传入的参数进行逐一解析,参数解析函数会通过调用getopt函数,来处理各种可能的参数选项:
static int parse_option(int argc, char *argv[]){intopt;int Optionindex;int Optionindex2;...while((opt = getopt_long(argc, argv, "fRrvHLP",long_options, &Optionindex)) != -1) {switch(opt) {case 'f':flags |= O_TRUNC;break;...}}return flags;}
接着,CP命令的源代码还包括处理函数,也就是具体处理拷贝文件的函数,该函数会通过调用open函数和read、write函数来完成文件拷贝:
static int cp_file(int in_fd, int out_fd, int src_fd, int dst_fd){int n_read;char buf[BUFSIZ];while ((n_read = read(in_fd, buf, BUFSIZ)) > 0) {if (write(out_fd, buf, n_read) != n_read)return -1;}return 0;}
最后,CP命令的源代码还包括文件权限相关函数,这里会通过调用fchmod函数来设定文件的权限,保证拷贝后的文件和源文件有相同的权限:
static int set_file_permissions(int src_fd, int dst_fd){struct stat statbufSrc;struct stat statbufDst;//获取源文件和目标文件的信息if (fstat (src_fd, &statbufSrc)== -1 ||fstat (dst_fd, &statbufDst) == -1)return -1;//将权限拷贝到被复制的文件中去if (fchmod (dst_fd, statbufSrc.st_mode)== -1)return -1;return 0;}
通过以上源代码分析我们可以知道,Linux系统中的CP命令主要是通过调用open函数和read\write函数,以及fchmod函数来完成文件的拷贝,并设定拷贝文件的权限。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
鱼鱼桌面乱码无法删除
很多朋友遇到过这样的情况:电脑中出现文件名是乱码的文件(以下简称乱码文件,注意:是文件名乱码而不是文件内容乱码),它们无法打开、重命名、删除或移动。 查看文件属性,系统显示无文件类型,而且它们一般占用巨大的磁盘空间。 本文着重讨论这些乱码文件名文件的产生原因以及如何删除这些烦人的乱码文件。 一、乱码文件名文件产生的原因 经过仔细分析和研究,我认为乱码文件产生的原因主要有以下几点: 1. 硬盘磁道或扇区出现错误,导致文件名出现乱码,这样的文件无法正常删除。 2. 有时候在Windows中执行的删除文件操作,只是将磁盘上文件分配表里的相关文件信息删掉了,并没有实际删除文件。 3. 不正确的操作。 在使用BT下载软件时,下载进度到99%时就停止下载,并自己修改文件名,由于BT下载不是顺序下载,这样有可能导致文件索引信息错误,导致乱码文件出现。 4. 使用磁盘工具PQmagic转换过分区格式之后(如从NTFS到FAT32),出现文件名乱码现象。 因为PQmagic对中文文件名的支持不是很好,所以,在整理完分区后会导致中文文件名出现乱码,甚至文件内容也出现乱码。 5. 病毒引起的文件名乱码,这种乱码文件产生的原因比较复杂,一般是由于病毒自己制造或杀毒软件删除病毒不彻底导致磁盘逻辑错误。 6. 闪存、移动硬盘等移动存储设备出现乱码文件,尤其是手机存储卡最容易出现这种问题。 这种情况多是由于不正确地使用移动存储设备造成的,比如直接拔离设备等。 但是有的时候质量不好的闪存或移动硬盘也会出现乱码文件,这是移动设备本身的质量问题。 比如当往存储卡中写入数据时出错,出现乱码文件,同时系统右下角出现“Windows延缓写入失败,Windows无法为x:/windows/文件保存所有数据”的提示,这多半是由于存储卡已经损坏了。 二、删除乱码文件名的文件 由于乱码文件产生的原因有多种,经过我仔细研究,找到了以下几种处理办法: 1. 尝试为文件重命名,如果可以重命名的话。 运行cmd 打开任务管理器,结束explorer进程,切换到cmd命令提示符状态下输入“Del 文件名”后就可以删除文件了,这种方法只适用于可以重命名的文件。 在进行操作时先关闭其他一切不相关的程序。 2. 如果重命名文件时系统提示“拒绝访问”,那么在cmd模式下运行“chkdsk /f”命令检查磁盘错误并修复。 如果出现找到磁盘错误,一般的错误都是可以修复的,在修复完成后就可以删除乱码文件了。 注意:有时,由于乱码文件所在分区为系统区,系统会提示“另一个进程正在调用该卷,是否希望下次开机时检查该卷?”我建议用这样的方法运行chkdsk命令,使用Windows安装盘引导系统,在选择新安装windows界面时,按“R”修复已有系统,进入命令提示符状态,在这里运行“chkdsk /f”命令。 我测试过,这样运行的效果要比在Windows下的cmd模式中好很多。 再运行“fixmbr”命令修复分区表。 也可以修复系统其他的问题。 3.如果进行完上一步仍然无法删除乱码文件,可以使用我们最常用的WinRAR压缩工具来删除,具体的方法是压缩乱码文件并选中“压缩后删除源文件”选项。 这样,一般的乱码文件就可以删除了。 4.但是如果文件的磁盘文件索引块已经被破坏,那WinRAR也是没有办法的,这时候就要借用Ghost这个强大的工具了。 先把有乱码文件的分区做成镜像文件,再使用Ghost explorer浏览镜像文件,找到乱码文件并删除,再把镜像文件恢复到源分区。 这个方法一般可以解决绝大数乱码文件名无法删除的问题。 5. 如果你装的是Windows和Linux双系统,还有一种解决办法。 首先,用Linux启动系统,用“mount”命令加载那个有乱码文件的FAT32 分区并指定codepage=cp437,就可以看到完整的中文文件名和目录了。 然后,用“cp -r”命令到拷贝乱码文件到Linux 分区上面; 再用“umount”命令卸载FAT32分区,重新用“mount”命令加载并指定 codepage = cp936,用“iocharset=cp936 cp -r”命令把乱码文件拷贝回去。 这个方法可以完全无损地恢复分区。 提示:对乱码文件,不要使用文件粉碎机、unlocker、优化大师等文件删除工具,这些工具对乱码文件没有作用,甚至会导致磁盘出现新的错误。
用C语言 写unix 的 cp指令
你问的不是很清楚。 cp命令的话cp dir1 dir2肯定不行的嘛,拷贝目录要加-R 或者-a参数的。 如果是自己写程序实现cp命令的话,用stat, 或者 lstat 或者 fstat函数。 具体查manpage.
LINUX下COPY一个文件夹的命令怎么写
1 cp-r/direcotry/new_directory_name 以上是复制一个文件夹的命令
发表评论