mkdir 在 C 中的 OS X 上出现波浪号失败?

mkdir fails with tilde on OS X in C?

我正在将一个 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"

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

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?, this was originally a csh shell feature which bash incorporated 中指出的那样(引用 1994 年的一页)。它未在任何给定系统的运行时库中实现。