Операция iOS mkfifo() не разрешена

У меня есть следующий код, который я вызываю из основной программы Swift в Xcode, и, например, при запуске его в симуляторе на виртуальном iPhone он работает. Он создает /tmp/MYFIFO.

int32_t init_udpC(void) {

    static char *filename="/tmp/MYFIFO";

    umask(0);
    unlink(filename);
    if((mkfifo(filename, 0666)) == -1){
        perror("mkfifo");
        exit(2);
    }
    if((fd=open("/tmp/MYFIFO",O_RDWR|O_APPEND)) == -1) {
        perror("open");
        exit(2);
    }
    return fd;
}

Запустив его на физическом устройстве, код не работает с

mkfifo: Operation not permitted


person Krischu    schedule 26.12.2018    source источник
comment
Я нашел эту ссылку stackoverflow.com/questions/5328398/ и служат полезным источником информации.   -  person Krischu    schedule 27.12.2018


Ответы (1)


Это из-за песочницы iOS. В iOS вашему приложению запрещен доступ к /tmp/. Это работает в симуляторе, потому что вы работаете на macOS, где все в порядке.

Вам нужно использовать путь, к которому разрешен доступ вашему приложению. Одна из возможностей - заменить путь на

const char *filename=[[NSTemporaryDirectory() stringByAppendingPathComponent:@"MYFIFO"] UTF8String];

Существуют и другие допустимые пути — ключ в том, что вам должен быть разрешен доступ к каталогу.

person Tom Harrington    schedule 26.12.2018
comment
Спасибо. NS (какао) присутствует не всегда. - person Krischu; 27.12.2018
comment
Есть и другие способы сделать это. Важной деталью является то, что вы должны иметь возможность написать директору, которого вы используете. - person Tom Harrington; 27.12.2018