我想知道是否有一种方法可以注册该单词,但是由于大多数现代搜索引擎无法使用长度超过5个单词的短语,因此在此方面我需要一些帮助。
我想知道这是因为我正在制作一个bash脚本,该脚本必须将文件注册为某些类型并做出相应的决定。从技术上讲,这对我的项目并不重要,但我很好奇。
另外,如果它们被认为是常规文件,那么有没有办法检查这些文件是否被硬链接而不需要解析ls -i
?有没有一种方法可以检查某些任意文件X是否在不使用find -i
命令的情况下硬链接到其他任意文件Y ?
我想知道是否有一种方法可以注册该单词,但是由于大多数现代搜索引擎无法使用长度超过5个单词的短语,因此在此方面我需要一些帮助。
我想知道这是因为我正在制作一个bash脚本,该脚本必须将文件注册为某些类型并做出相应的决定。从技术上讲,这对我的项目并不重要,但我很好奇。
另外,如果它们被认为是常规文件,那么有没有办法检查这些文件是否被硬链接而不需要解析ls -i
?有没有一种方法可以检查某些任意文件X是否在不使用find -i
命令的情况下硬链接到其他任意文件Y ?
Answers:
在Unix风格的系统中,代表文件系统对象的数据结构(换句话说,关于文件的数据)存储在所谓的“索引节点”中。
文件名只是指向该索引节点的链接,被称为“硬链接”。给定文件的名字与任何后续链接之间没有区别。因此答案是“是”:硬链接是常规文件,实际上,常规文件是硬链接。
该ls
命令将向您显示该文件有多少个硬链接。
例如:
seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct 4 13:05 /tmp/hello.txt
在这里,我们创建了一个名为的文件/tmp/hello.txt
。在1
从输出ls -l
表明,有1个硬盘链接到本文件。该硬链接是文件名本身/tmp/hello.txt
。
如果我们现在创建与此文件的另一个硬链接:
seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct 4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct 4 13:05 /tmp/hello.txt
您现在可以看到两个文件名都表明该文件有2个硬链接。这些都不是“适当的”文件名,它们都同样有效。我们可以看到它们都指向同一个索引节点(在本例中为5374043):
seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt 5374043 /tmp/hello.txt
有一个普遍的误解,认为目录是不同的。我听到人们说,通过返回的链接数量ls
为目录的子目录的数目,包括.
和..
这是不正确。或者,至少,尽管它会为您提供正确的数字,但由于错误的原因,这是对的!
如果我们创建目录并执行一个操作,ls -ld
则会得到:
seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct 4 13:20 /tmp/testdir
这表明此目录有2个硬链接。这些是:
/tmp/testdir
/tmp/testdir/.
请注意,/tmp/testdir/..
是不是该目录的链接,这是一个链接/tmp
。这告诉您为什么“子目录数”有效。当我们创建一个新的子目录时:
seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct 4 13:24 /tmp/testdir
您现在可以看到/tmp/testdir
目录有3个硬链接。这些是:
/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..
因此,每个新的子目录都会由于..
其包含的条目而将链接数增加一。
硬链接算作普通文件吗?
硬链接算作链接的对象。您可以链接到同一文件系统上的任何内容。
mkdir test
cd !$
>file
ln -s file sym
mknod pipe p
ln file file2
ln -P sym sym2
ln pipe pipe2
ls -al
# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
struct sockaddr_un test = { AF_UNIX, "socket" };
int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock
ln socket socket2
ls -al
# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty
ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2
每个硬链接都是等效的,只要所有对象之间都存在任何(编辑:非符号)链接(甚至是一个打开的文件描述符,对此我都会感到尴尬),底层对象就会始终存在。
系统将对目录链接强制执行规则,您将获得一个指向目录的命名链接,并且系统会自动添加其嵌入式.
链接和任何子目录的..
链接(请注意,.
在上面的ls中有两个链接),但这是对某些模块的显式检查承诺诺言的系统特权用户承诺不会进行循环,可以自己添加新链接。文件系统不在乎,它可以表示任意目录图,但没有人愿意处理它们。
有(许多非Unix)文件系统不能以这种方式工作,包括一些将它们提供的文件系统称为“硬链接”的文件系统。如果我没记错的话,OS X在HFS +上已经有了等同的功能(它本身没有),我不知道它在多大程度上忠实地保留了语义。
./tsock
实际上是做什么的?
socket()
创建一个实际的套接字,bind()
为其指定一个特定的名称,connect()
将您连接到某些命名的套接字。不同种类的插座使用不同种类的名称,例如互联网插座使用的互联网地址,但他们都有着共同的API(包括read()
和write()
,这让我伤心,你不能open()
一个文件系统插座并有OS或libc的做socket()
和connect()
你) 。 man 7 socket
拥有更多功能,所有网络协议的确使人烦躁不安。