符号链接

硬链接和符号链接的区别

不想你离开。 提交于 2019-12-30 00:57:55
序 在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号 。 文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。 链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。 Linux中的两种链接 Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。 硬链接 硬链接是文件的别名 。从技术上讲,他们公用一个inode(inode中包含了一个文件的所有必要的信息,说inode就是文件也是没有问题的)。 由于linux下的文件是通过索引节点(Inode)来识别文件,硬链接也可以认为是一个指向文件索引节点的指针,系统并不为它重新分配inode, 每添加一个一个硬链接,文件的链接数就加1, 删除一个则链接数减1。 大多数系统不允许创建一个目录的硬链接 。在允许创建目录硬链接的系统上,只有超级用户才能才能这样做。 不能创建跨文件系统(分区)的硬链接 (这些限制在POSIX中都不是强制性的)。 硬链接的创建语法 : ln 存在的文件 新的文件 [root@localhost link]# touch SingleFile ;新建一个空文件 [root@localhost link]# ls -l

linux更改用户权限

匆匆过客 提交于 2019-12-25 01:33:23
chown [-cfhvR] [--help] [--version] user[:group] file... 参数 : user : 新的文件拥有者的使用者 ID group : 新的文件拥有者的使用者组(group) -c : 显示更改的部分的信息 -f : 忽略错误信息 -h :修复符号链接 -v : 显示详细的处理信息 -R : 处理指定目录以及其子目录下的所有文件 --help : 显示辅助说明 --version : 显示版本 来源: CSDN 作者: 我琴美如画中仙m 链接: https://blog.csdn.net/qq_44054827/article/details/103687881

符号链接和硬链接有什么区别?

杀马特。学长 韩版系。学妹 提交于 2019-12-23 00:27:30
最近我在求职面试时被问到这个问题。 我是诚实的,并说我知道符号链接的行为以及如何创建一个,但不理解硬链接的使用以及它与符号链接的区别。 #1楼 使用任何Linux(ish)控制台可能有所帮助的一些很好的直觉。 创建两个文件: $ touch foo; touch bar 在其中输入一些数据: $ echo "Cat" > foo $ echo "Dog" > bar (实际上,我可以首先使用echo,因为它创建了文件,如果它们不存在......但不要介意。) 正如所料: $cat foo; cat bar Cat Dog 让我们创建硬链接和软链接: $ ln foo foo-hard $ ln -s bar bar-soft 让我们看看刚刚发生了什么: $ ls -l foo foo-hard bar bar-soft -> bar 更改foo的名称无关紧要: $ mv foo foo-new $ cat foo-hard Cat foo-hard指向文件的inode,内容 - 没有改变。 $ mv bar bar-new $ ls bar-soft bar-soft $ cat bar-soft cat: bar-soft: No such file or directory 无法找到文件的内容,因为软链接指向已更改的名称,而不是内容。 同样,如果 foo 被删除, foo

应用程序与驱动程序交互函数DeviceIoControl详解

人盡茶涼 提交于 2019-12-21 03:32:50
这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_DEVICE_CONTROL(DeviceIoControl函数会产生此IRP),MinorFunction 为自己定义的控制码的IRP,系统就调用相应的处理IRP_MJ_DEVICE_CONTROL的派遣函数,你在派遣函数中判断MinorFunction ,是自定义的控制码你就进行相应的处理。 一.先谈一下这个定义IO控制码 ,其实可以看作是一种通信协议。 看看CTL_CODE原型:    # define CTL_CODE( DeviceType, Function, Method, Access ) ( \   ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \   ) 可以看到,这个宏四个参数,自然是一个32位分成了4部分,高16位存储设备类型,14~15位访问权限,2~13位操作功能,最后0,1两位就是确定缓冲区是如何与I/O和文件系统数据缓冲区进行数据传递方式,最常见的就是METHOD_BUFFERED。 自定义CTL_CODE: #define IOCTL_Device_Function CTL_CODE

描述编译和链接过程

谁都会走 提交于 2019-12-20 18:04:09
原文摘自: http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html [yc]详解link 详解link 有些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后,或许会有一些答案。 首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visual Studio,Elicpse,Dev C++等),你可能不会发现程序是如何组织起来的(很多人因此而反对初学者使用IDE)。因为使用IDE,你所做的事情,就是在一个项目里新建一系列的.cpp和.h文件,编写好之后在菜单里点击“编译”,就万事大吉了。但其实以前,程序员写程序不是这样的。他们首先要打开一个编辑器,像编写文本文件一样的写好代码,然后在命令行下敲 cc 1.cpp -o 1.o cc 2.cpp -o 2.o cc 3.cpp -o 3.o 这里cc代表某个C/C++编译器,后面紧跟着要编译的cpp文件,并且以-o指定要输出的文件(请原谅我没有使用任何一个流行编译器作为例子)。这样当前目录下就会出现: 1.o 2.o 3.o 最后

安装jdk出现 Could not create the Java Virtual Machine错误

假装没事ソ 提交于 2019-12-17 01:25:55
问题描述 在安装好jdk之后,配置完环境变量,在控制台运行java -version检查是否安装成功时,出现以下错误 原因 可能是环境变量配置的路径错误或者路径不规范(包含中文目录或者中文符号)导致的 来源: CSDN 作者: qq_44209563 链接: https://blog.csdn.net/qq_44209563/article/details/103566410

删除目录的符号链接

蹲街弑〆低调 提交于 2019-12-12 22:01:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我有一个重要目录的符号链接。 我想摆脱那个符号链接,同时保持它背后的目录。 我试过 rm 然后回来 rm: cannot remove 'foo' 。 我尝试了 rmdir 并找回了 rmdir: failed to remove 'foo': Directory not empty 然后我通过 rm -f , rm -rf 和 sudo rm -rf 进展 然后我去寻找我的备份。 有没有办法摆脱符号链接,而不是用洗澡水扔掉婴儿? #1楼 使用 rm symlinkname 但不要在末尾包含正斜杠(不要使用: rm symlinkname/ )。 然后,您会被询问是否要删除符号链接, y 回答yes。 #2楼 如果rm无法删除符号链接,您可能需要查看包含符号链接的目录的权限。 要删除目录条目,您需要对包含目录具有写入权限。 #3楼 使用“unlink”命令并确保 不在 最后使用/ $ unlink mySymLink unlink()从文件系统中删除名称。 如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且其使用的空间可供重用。 如果名称是文件的最后一个链接,但任何进程仍然打开文件,则文件将保持存在,直到引用它的最后一个文件描述符关闭。 我认为如果我正确阅读它可能会有问题。

链接过程详解

橙三吉。 提交于 2019-12-11 05:39:26
一:链接的基本概念 链接(linking)是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。 链接可以执行于编译时,也可以执行于加载时,甚至执行于运行时。在现代系统中,链接是由叫做链接器(linker)的程序自动执行的。 为什么需要链接器呢?一切都是为了简单、为了方便!试想一下,一个巨大的工程有巨大的源文件,包含N多个模块,如果没有链接的存在,那么当你改动某个模块时,不得不重新编译整个工程,消耗巨大的时间和资源。而在链接器的帮助下,你只需要简单编译修改过的模块,之后重新链接生成可执行文件就OK了。 下面,我们将基于一个运行Linux的x86-64系统,详细讨论关于链接的各个方面。 二:从代码到可执行文件 考虑如下的一个c语言程序: code/link/main.c int sun(int *a, int n); int array[2] = {1, 2}; int main() { int val = sum(array, 2); return val; } code/link/sum.c int sum(int *a, int n) { int i, s = 0; for (i = 0; i < n; i++) s += a[i]; return s; } 从源文件到可执行文件需要哪几个步骤呢? 1:预处理器将C的源程序main

《程序员的自我修养》读书笔记 第二章 编译和链接

戏子无情 提交于 2019-12-05 20:51:15
2.1 被隐藏了的过程 在平常的应用程序开发中一般都不需要关注编译和链接过程,因为在IDE开发环境中一般都将编译和链接合到一起一步完成,直接生成可执行文件;通常将这个过程称为 构建(Buil) 。 对于最经典的C语言版"Hello World"的代码: #include <stdio.h> int main() { printf("Hello World\n"); return 0; } 我们在Linux下使用GCC来编译该代码时,只需使用几行简单的命令就完成对上述代码的编译等一系列过程(假设源码文件名为hello.c),生成可直接运行的的程序: $gcc hello.c $./a.oout Hello World 事实上,上述过程可分解为4个步骤,分别是 预处理(preprocess) 、 编译(compilation) 、 汇编(assembly) 和 链接(linking) ,其中前三个阶段都是文本形式的处理,如下图所示: 下面分别大致介绍下各个步骤的作用。 预编译 预编译过程主要处理那些源代码文件中以“#”开始的预编译指令。比如“#include”、“#define”等,常见的处理规则如下: 将所有的“#define”删除,并且展开所有的宏定义。 处理所有条件预编译指令,比如“#if”、“#ifdef”、“#endif”等。 处理“#include”预编译指令

硬链接与软链接(符号链接)

久未见 提交于 2019-12-05 17:25:54
我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分: 用户数据 (user data) 与元数据 ( metadata) 。 用户数据 ,即文件数据块 (data block),数据块是记录文件真实内容的地方; 元数据 则是文件的附加属性,如文件名、文件大小、创建时间、所有者、文件所在的inode等信息。 在 Linux 中,元数据中的 inode 号(inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。 硬链接 硬链接是新的目录条目,其引用系统中的现有文件。文件系统中的每一文件默认具有一个硬链接。为节省空间,可以不复制文件,而创建引用同一文件的新硬链接。新硬链接如果在与现有硬链接相同的目录中创建,则需要有不同的文件名,否则需要在不同的目录中。指向同一文件的所有硬链接具有相同的权限、连接数、用户/组所有权、时间戳以及文件内容。指向同一文件内容的硬链接需要在相同的文件系统中。 简单说,硬链接就是一个 inode 号对应多个文件。就是同一个文件使用了多个别名(上图中 hard link 就是 file 的一个别名,他们有共同的 inode) 由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性: (1)文件有相同的 inode 及 data