mkdir 在 OS X 上用 C 语言失败并显示波形符?

wht*_*lnv 1 c macos errno mkdir

我正在将一个 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;        
}
Run Code Online (Sandbox Code Playgroud)

无论directory是什么,mkdir()总是失败EPERM(不允许操作)。我不确定 xcode 可执行文件是否已沙箱化,或者我是否丢失了某些内容,但我传递给该函数的每个路径都失败了。

我尝试从终端 mkdir 并且创建文件夹没有问题,所以我不确定问题出在哪里。该函数在 Linux 和 Solaris 中运行良好。

示例路径:

"~/Library/Application\\ Support/myApp"
"~/Desktop/myApp"
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*key 5

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;
}
Run Code Online (Sandbox Code Playgroud)

我在 OSX 上得到这个结果:

/private/tmp/~/Library
Run Code Online (Sandbox Code Playgroud)

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

/tmp/~/Library
Run Code Online (Sandbox Code Playgroud)

为什么波形符 (~) 不在双引号内展开?,这最初是很久以前合并的csh shell功能(引用 1994 年的一页)。它没有在任何给定系统的运行时库中实现。bash