atoi() 函数只翻译十进制,而不是八进制。
对于八进制转换,使用strtol()(或者,正如Chris Jester-Young 指出的那样,strtoul() - 尽管 Unix 文件权限模式的有效大小都适合 16 位,因此永远不会产生负数 @987654325 @ 不管怎样)以 0 或 8 为基数。实际上,在这种情况下,指定 8 是最好的。它允许人们编写 777 并获得正确的八进制值。指定基数为 0 时,字符串 777 是十进制的(再次)。
另外:
将所有更改放在一起产生:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
int main(int argc, char **argv)
{
char mode[] = "0777";
char buf[100] = "/home/hello.t";
int i;
i = strtol(mode, 0, 8);
if (chmod (buf,i) < 0)
{
fprintf(stderr, "%s: error in chmod(%s, %s) - %d (%s)\n",
argv[0], buf, mode, errno, strerror(errno));
exit(1);
}
return(0);
}
小心errno;它可以在调用函数时更改。这里已经足够安全了,但是在很多场景下,将errno捕获到一个局部变量中并在打印操作等中使用该局部变量是个好主意。
还要注意,代码不会对strtol() 的结果进行错误检查。在这种情况下,它是足够安全的;如果用户提供了该值,那么相信他们会正确处理将是一个坏主意。
最后一条评论:通常,您不应该对文件(或目录)使用 777 权限。对于文件,这意味着您不介意谁可以修改您的可执行程序,或者如何修改。通常情况并非如此;您确实关心(或应该关心)谁修改了您的程序。通常,根本不要使数据文件可执行;当文件是可执行的时,不要给公共写访问权限,并怀疑组写访问权限。对于目录,公共写权限意味着您不介意谁删除了目录中的任何文件(或添加文件)。同样,偶尔,这可能是正确的权限设置,但很少是正确的。 (对于目录,使用 'sticky bit' 通常也是个好主意:例如,/tmp 上通常使用 1777 权限 - 但在 MacOS X 上不使用。)