link的linux中link函数

link的linux中link函数,第1张

文件

#include <unistd.h>

函数原型

int link (const char * oldpath,const char * newpath)

说明

link()以参数newpath指定的名称来建立一个新的连接(硬连接)到参数oldpath所指定的已存在文件。如果参数newpath指定的名称为一已存在的文件则不会建立连接。函数在执行成功时则返回0,失败时则返回-1,错误原因存于errno。 link()所建立的硬连接无法跨越不同文件系统,如果需要请改用symlink()。

errno错误代码:

EXDEV 参数oldpath与newpath不是建立在同一文件系统。

EPERM 参数oldpath与newpath所指的文件系统不支持硬连接

EROFS 文件存在于只读文件系统内

EFAULT 参数oldpath或newpath 指针超出可存取内存空间。

ENAMETOLLONG 参数oldpath或newpath太长

ENOMEM 核心内存不足

EEXIST 参数newpath所指的文件名已存在。

EMLINK 参数oldpath所指的文件已达最大连接数目。

ELOOP 参数pathname有过多符号连接问题

ENOSPC 文件系统的剩余空间不足。

EIO I/O 存取错误。

范例

/* 建立/etc/passwd 的硬连接为pass */ #include<unistd.h>main(){link(/etc/passwd,pass)}

每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数。

当通过shell的touch命令或者在程序中open一个带有O_CREAT的不存在的文件时,文件的链接数为1。

通常open一个已存在的文件不会影响文件的链接数。open的作用只是使调用进程与文件之间建立一种访问关系,即open之后返回fd,调用进程可以通过fd来read 、write 、 ftruncate等等一系列对文件的 *** 作。

close()就是消除这种调用进程与文件之间的访问关系。自然,不会影响文件的链接数。在调用close时,内核会检查打开该文件的进程数,如果此数为0,进一步检查文件的链接数,如果这个数也为0,那么就删除文件内容。

link函数创建一个新目录项,并且增加一个链接数。

unlink函数删除目录项,并且减少一个链接数。如果链接数达到0并且没有任何进程打开该文件,该文件内容才被真正删除。如果在unlilnk之前没有close,那么依旧可以访问文件内容。

综上所诉,真正影响链接数的 *** 作是link、unlink以及open的创建。

删除文件内容的真正含义是文件的链接数为0,而这个 *** 作的本质完成者是unlink。close能够实施删除文件内容的 *** 作,必定是因为在close之前有一个unlink *** 作。

举个例子简单说明:通过shell touch test.txt

1、stat("test.txt",&buf)

printf("1.link=%d\n",buf.st_nlink)//未打开文件之前测试链接数

2、fd=open("test.txt",O_RDONLY)//打开已存在文件test.txt

stat("test.txt",&buf)

printf("2.link=%d\n",buf.st_nlink)//测试链接数

3、close(fd)//关闭文件test.txt

stat("test.txt",&buf)

printf("3.link=%d\n",buf.st_nlink)//测试链接数

4、link("test.txt","test2.txt")//创建硬链接test2.txt

stat("test.txt",&buf)

printf("4.link=%d\n",buf.st_nlink)//测试链接数

5、unlink("test2.txt")//删除test2.txt

stat("test.txt",&buf)

printf("5.link=%d\n",buf.st_nlink)//测试链接数

6、重复步骤2 //重新打开test.txt

7、unlink("test.txt")//删除test.txt

fstat(fd,&buf)

printf("7.link=%d\n",buf.st_nlink)//测试链接数

8、close(fd)//此步骤可以不显示写出,因为进程结束时,打开的文件自动被关闭。

顺次执行以上8个步骤,结果如下:

1.link=1

2.link=1//open不影响链接数

3.link=1//close不影响链接数

4.link=2//link之后链接数加1

5.link=1//unlink后链接数减1

2.link=1//重新打开 链接数不变

7.link=0//unlink之后再减1,此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过 文件名访问,但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息。

执行步骤8,文件内容被删除。。。。

Netlink套接字是用以实现 用户进程 内核进程 通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。

在Linux 内核中,使用netlink 进行应用与内核通信的应用有很多,如

Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。

一般来说用户空间和内核空间的通信方式有三种: /proc、ioctl、Netlink 。而前两种都是单向的,而Netlink可以实现双工通信。

Netlink 相对于系统调用,ioctl 以及 /proc文件系统而言,具有以下优点:

Netlink协议基于BSD socket和 AF_NETLINK 地址簇,使用32位的端口号寻址,每个Netlink协议通常与一个或一组内核服务/组件相关联,如 NETLINK_ROUTE 用于获取和设置路由与链路信息、 NETLINK_KOBJECT_UEVENT 用于内核向用户空间的udev进程发送通知等。

用户态应用使用标准的 socket API有sendto(),recvfrom(), sendmsg(), recvmsg()。

Netlink通信跟常用UDP Socket通信类似, struct sockaddr_nl 是netlink通信地址,跟普通 socket struct sockaddr_in 类似。

netlink_kernel_create内核函数用于创建内核socket与用户态通信

首先将编译出来的Netlink内核模块插入到系统当中(insmod netlink_test.ko),然后运行应用程序,可以看到如下输出:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7362401.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存