OSX上的mkdir因EPERM而失败

时间:2015-05-17 08:48:14

标签: c macos mkdir errno

我正在将一个C库移植到OSX,直到现在还没有给我带来太多麻烦。在下一个功能中:

int createDirectory( char *directory ){

    int error;

    error = mkdir(directory, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);

    if( error < 0 ){

        if( errno != EEXIST ){       

            return errno;           

        }

    }

    return error;

}

无论directory是什么,mkdir()总是以EPERM失败(不允许操作)。我不确定xcode可执行文件是否为沙箱,或者我是否遗漏了某些东西,但是我传递给该函数的每条路径都失败了。

我已经尝试从终端创建mkdir,文件夹创建没有问题,所以我不确定问题出在哪里。此功能在Linux和Solaris中运行良好。

示例路径:

"~/Library/Application\\ Support/myApp"
"~/Desktop/myApp"

第一个是库应该创建的目录的实际示例。

1 个答案:

答案 0 :(得分:3)

OSX不会像'~'那样展开bash字符(虽然它使用bash)。

鉴于此计划,请在/tmp中运行:

#include <stdlib.h>
#include <sys/stat.h>
#include <stdio.h>

int main(void)
{
    char *given = "~/Library";
    char result[1024];
    char *s;
    mkdir("~", 0755);
    mkdir("~/Library", 0755);
    if ((s = realpath(given, result)) != 0) {
        printf ("%s\n", s);
    } else {
        perror("realpath");
    }
    return 0;
}

我在OSX上得到了这个结果:

/private/tmp/~/Library

我在Linux(Debian)以及Solaris 10上得到了这个结果:

/tmp/~/Library

Why doesn't the tilde (~) expand inside double quotes? 所述,这最初是csh shell 功能,bash incorporated很久以前(引用1994年的一页)。它没有在任何给定系统的运行时库中实现。