Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我应该每次指定装载类型吗?_C_Kernel_System Calls - Fatal编程技术网

C 我应该每次指定装载类型吗?

C 我应该每次指定装载类型吗?,c,kernel,system-calls,C,Kernel,System Calls,我想听听你对系统调用的看法:mount() 今天,一个问题又让人产生了这种怀疑。 我看到很多调用/使用mount()syscall的代码。 但是,最近,运行Valgrind时,它显示了一个错误,即 无法将NULL指定为装载函数的“type”参数 内核代码中的一个示例: ret = mount("/dev/pts/ptmx", "/dev/ptmx", NULL, MS_BIND, NULL); Valgrind抱怨第一个空参数引用 安装类型: ==18012== Syscall param m

我想听听你对系统调用的看法:mount()

今天,一个问题又让人产生了这种怀疑。 我看到很多调用/使用mount()syscall的代码。 但是,最近,运行Valgrind时,它显示了一个错误,即 无法将NULL指定为装载函数的“type”参数

内核代码中的一个示例:

ret = mount("/dev/pts/ptmx", "/dev/ptmx", NULL, MS_BIND, NULL);
Valgrind抱怨第一个空参数引用 安装类型:

==18012== Syscall param mount(type) points to unaddressable byte(s)
将NULL替换为“无”后,错误消失。 我读了一份关于它的文档,说最好使用“无” 用于绑定和移动选项。但是,我说得不对

x86_64位不使用绑定和移动的类型。如果我读了右边拱门的密码


您有使用此系统调用的任何文档或最佳实践吗?

当在标志中传递
MS_BIND
mount()
时,传递
NULL
作为第三个参数是正确的,传递
也不是更好或更坏的。两者都依赖于这样一个事实,即绑定挂载忽略了该参数(这是有文档记录的)

Valgrind说得对,
NULL
是一个不指向数据的指针,当作为参数显示时,
“none”
衰减为一个指向数据的指针。它没有足够的洞察力来认识到这在这里并不重要。如果让Valgrind闭嘴是您最关心的问题,那么传递
“none”
是一种很好的方法

对于我自己,我可能只会使用
NULL
,因为这会更好地向其他人(包括未来的我)传达我正在传递一些我不希望使用的东西。出于同样的原因,如果我要在这里使用一个字符串来平息暴躁的Valgrind,那么我可能会选择一个更像
“因为MS_BIND而不使用”

另一方面,当装载数据存储在一个文件(即
/etc/fstab
)中时,您必须在字段中输入一些内容,并且在字段中显示“无”
将该级别的重要信息传达给该数据的人类消费者的工作做得非常出色。

“将NULL替换为键入“none”后,错误消失。”我看到两个NULL,其中一个是您替换的?“您有使用此系统调用的任何文档或最佳实践吗?”我认为valgrind不会无缘无故地告诉您。装载手册从未指定NULL为有效参数。@Stargateur第一个NULL参数是指装载fs类型:int mount(const char*source,const char*target,const char*filesystemtype,unsigned long mountflags,const void*data);我不理解您的问题;手册页上说:“指定mounttype”,然后指定mounttype,以前没有,现在可以了。问题出在哪里?Valgrind抱怨第一个空值。问题是:我读了一些关于使用“无”的建议替换fs类型的NULL。但是,我的说法不对。既然在手册页中不允许使用NULL,为什么还要使用NULL?它可能会与libc的下一个补丁级别或其他版本发生冲突environment@Ctx,manapage不显式允许该参数使用任何特定值(它仅给出可能受支持的参数示例)另一方面,它明确地说,在OP的情况下,所讨论的参数被忽略了。我可以毫无疑问地依赖文档的这一方面来得出结论,无论参数是什么,行为都是定义良好且一致的,只要参数正确是的,它声明了允许的值:“内核支持的filesystemtype参数的值列在/proc/filesystems中(例如,“minix”、“ext2”、“ext3”、“jfs”、“xfs”、“reiserfs”、“msdos”、“proc”、“nfs”、“iso9660”)。”。如果有一个允许值列表,则可以认为任何其他值都是不允许的。否,@Ctx。它说明了在何处查找允许值(
/proc/filesystems
)。提供的值是示例(这正是“e.g.”的含义)。毫无疑问,您会发现
NULL
未列在
/proc/filesystems
中,但
也不是“none”
,至少在我的机器上是如此。使用其中任何一个都依赖于“如果mountflags包括
MS_BIND
[…t],则
文件系统类型
数据
参数将被忽略。”再说一次,我对这种依赖很满意。“它说明在哪里可以找到允许的值”是“说明允许的值”。是的,来自“/proc/filesystems”,是的,这里的值有一些例子。你为什么在这里开始发毛?你是说我不能读和理解这么简单的句子吗?这很粗鲁。是的,如果“没有”也没有列出,不应该使用。就这么简单。做你想做的,做你想做的,但我认为你不应该向别人推荐这样不安全的东西。