咨询一个问题,关于linux下glib2.22中unlinkat函数的定义

feekee 2017-08-04 10:52:12
我想咨询这样一个问题:
在我的linux Fedors 23上,内核是4.2.3,glic是2.22
[test@localhost glibc-2.22-build]$ uname -a
Linux localhost 4.2.3-300.fc23.x86_64 #1 SMP Mon Oct 5 15:42:54 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[test@localhost glibc-2.22-build]$ rpm -qa | grep -i glibc
glibc-devel-2.22-18.fc23.x86_64
glibc-2.22-18.fc23.x86_64
glibc-common-2.22-18.fc23.x86_64
glibc-2.22-18.fc23.i686
glibc-headers-2.22-18.fc23.x86_64
glibc-static-2.22-18.fc23.x86_64

如果man unlinkat,返回的内容如下:
UNLINK(2) Linux Programmer's Manual UNLINK(2)
NAME
unlink, unlinkat - delete a name and possibly the file it refers to
SYNOPSIS
#include <unistd.h>
int unlink(const char *pathname);
#include <fcntl.h> /* Definition of AT_* constants */
#include <unistd.h>
int unlinkat(int dirfd, const char *pathname, int flags);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
unlinkat():
Since glibc 2.10:
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
Before glibc 2.10:
_ATFILE_SOURCE

unlinkat()
The unlinkat() system call operates in exactly the same way as either unlink() or rmdir(2) (depending on
whether or not flags includes the AT_REMOVEDIR flag) except for the differences described here.

VERSIONS
unlinkat() was added to Linux in kernel 2.6.16; library support was added to glibc in version 2.4.
可以看到,按照man说明,在glib2.4中才有了unlinkat的库函数,那么,为什么我的fedora 23上man unlinkat在开头就可以看到unlinkat的说明了呢?
继续写一个简单的c程序测试一下能否用,
[test@localhost 1707]$ cat 4.c
#include <unistd.h>
main(){
unlinkat(10,"test",1);
}
[test@localhost 1707]$ gcc -o 4 4.c
4.c:2:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main(){
^
[songkun@localhost 1707]$
可以看到,是编译成功的。 下载了fedora 23对应的glibc srpm包,解压以后,手动./configure,make,
结果如下:
[test@localhost glibc-2.22-build]$ pwd
/home/test/OS/A.7/glibc-2.22-18/glibc-2.22-build
用find找了一下,发现其实是编译出了unlinkat的目标文件的,
[songkun@localhost glibc-2.22-build]$ find . -name unlinkat*
./io/unlinkat.os.d
./io/unlinkat.os
./io/unlinkat.o.d
./io/unlinkat.o
用objdump看一下编译出来的目标文件,发现内容如下,
[songkun@localhost glibc-2.22-build]$ objdump -d ./io/unlinkat.o

./io/unlinkat.o: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <unlinkat>:
0: b8 07 01 00 00 mov $0x107,%eax
5: 0f 05 syscall
7: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax
d: 0f 83 00 00 00 00 jae 13 <unlinkat+0x13>
13: c3 retq
这不是与man中“ library support was added to glibc in version 2.4”矛盾了么。

其实,我想问的是,如果在glibc-2.22中没有unlinkat这个库函数,那么coreutils中的rm实现对unlinkat的调用,不是就没法真正调用了么? 想的糊涂了,请大大们帮忙清晰一下,多谢
...全文
386 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
feekee 2017-08-12
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[quote=引用 6 楼 feekee 的回复:] 我汗啊,还是让愿意解决问题的人来解决吧 怎么比喻呢,咱们离得太远了,我都看不清您要表达什么,也不明白你的意思。。
我的意思是要你尊重自己眼前的事实,鄙视别人对他自己过去事实的描述。[/quote] 好吧,就是事实与我原来的认知不一致,才有此提问的 不过平常与人讨论的少,所以往往一下子发出来很多东西,别人也看不明白到底是什么意思
feekee 2017-08-12
  • 打赏
  • 举报
回复
这个问题描述的不太好,可能问的不太清楚 : 我在学习rm的实现,最终找到了是unlinkat()函数对对象进行删除,函数调用如上面帖子中的贴图。明显,这应该是个函数调用;但是我man unlinkat()的时候,看到手册里说unlinkat是个系统调用。所以,想问一下各位大大,系统调用的使用是不是也类似glibc中的fopen、fread等函数,在c程序中可以直接使用(排除内联汇编的情况)? 以及,该页man里面写到2.4版本的glibc才增加了unlinkat库,怎么我的glibc是 2.22中就有了,而且还在相应linux发行版的coreutils的rm实现中直接就使用了?要么只可能是这个发行版下安装的man手册不同步,请各位对开源软件的版本和发展比较了解的老大们帮忙解释一下,多谢
赵4老师 2017-08-08
  • 打赏
  • 举报
回复
引用 6 楼 feekee 的回复:
我汗啊,还是让愿意解决问题的人来解决吧 怎么比喻呢,咱们离得太远了,我都看不清您要表达什么,也不明白你的意思。。
我的意思是要你尊重自己眼前的事实,鄙视别人对他自己过去事实的描述。
feekee 2017-08-08
  • 打赏
  • 举报
回复
我汗啊,还是让愿意解决问题的人来解决吧 怎么比喻呢,咱们离得太远了,我都看不清您要表达什么,也不明白你的意思。。
赵4老师 2017-08-08
  • 打赏
  • 举报
回复
任何问题首先是一个哲学问题。
feekee 2017-08-08
  • 打赏
  • 举报
回复
楼上您好, 如果您发现我的内容哪里不对或者有问题,请及早告诉我 您发这些虚无缥缈的说法,有嘛用啊 再说了,上面这个帖是不是有推广博客的嫌疑……?
赵4老师 2017-08-04
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
赵4老师 2017-08-04
  • 打赏
  • 举报
回复
feekee 2017-08-04
  • 打赏
  • 举报
回复
我倒,楼上怎么回答了一个口号啊, 忽然想起来,最后少了一个说明coreutils中unlinkat调用的截图,这样大家可能不知道在说什么 这个是对rm进行追踪找到的最后删除文件时的代码 PS楼上大大:就是看到了事实,然后理论上有些想不通~

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧