有没有办法确定进程是否可以执行文件而不必实际执行它(例如,只调用execv(filepath, args)
失败并发现errno == EACCES
) ?
我可以stat
该文件并观察st_mode
,但之后我仍然不知道这与该过程有何关系。
理想情况下,我正在寻找符合
的功能get_me_permissions(filepath, &status); // me: the process calling this function
// when decoded, status tells if the process can read, write, and/or execute
// the file given by filepath.
提前致谢。
答案 0 :(得分:6)
假设您的最终目标是最终执行该程序,则不会。这个测试没用,因为即使在使函数返回之前,结果也可能出错!由于权限错误,您必须准备好处理execve
的失败。
正如Steve Jessop所指出的,检查给定文件是否可执行可以在某些情况下有用,例如文件列表(ls -l
)或可视文件管理器。人们当然可以想到更多深奥的用法,例如使用文件的权限位进行进程间通信(作为一种不需要任何资源分配的方法很有趣),但我怀疑stat
(“有什么权限比特设置为?“)而不是access
(”调用进程是否具有X权限?“)更可能是一个有趣的问题......
答案 1 :(得分:5)
http://linux.die.net/man/2/access
请注意suid周围的细微诡计 - 如果进程具有有效的超级用户权限,则不予考虑,因为该函数的一般概念是检查原始调用用户是否应具有访问权限到该文件,而不是检查此进程是否可以访问该文件。