Как проверить, что вызов `mkfifo` завершился успешно? - PullRequest
0 голосов
/ 23 января 2020

Я новичок в программировании на C ++ и пытаюсь использовать команду mkfifo для создания именованного канала, который я могу прочитать из моей программы java. Вот мой код:

int main(int, char **)
{
    std::cout << "START" << std::endl;
    int fd;

    // FIFO file path
    char *myfifo = "/sdcard/tempFifo";

    // Creating the named file(FIFO)
    // mkfifo(<pathname>, <permission>)
    int ret = mkfifo(myfifo, 0666);
    std::cout << "mkfifo ret " << ret << std::endl;
    std::cout << "errno " << errno << std::endl;
    std::cout << "errno str::" << std::strerror(errno) << std::endl;

    char arr1[80];
    int startCount = 0;
    while (1)
    {

        // Open FIFO for Read only
        std::cout << "Opening FIFO.." << std::endl;
        fd = open(myfifo, O_RDONLY);

        // Read from FIFO
        std::cout << "Start reading.." << std::endl;
        read(fd, arr1, sizeof(arr1));

        if (strcmp(arr1, "start") == 0)
        {
            if (startCount == 1)
            {
                std::cout << "Start count is greater than one so exit." << std::endl;
                return 0;
            }
            startCount++;
            std::cout << "Start received" << std::endl;
        }

        sleep(5000);
        close(fd);
    }
    std::cout << "STOP" << std::endl;
    return 0;
}

Чтобы написать "start" на целевой трубе, я использую код java как:

            File file = new File("/sdcard/tempFifo");
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            PrintWriter printWriter = new PrintWriter(fileOutputStream);
            printWriter.print("start");
            printWriter.flush();
            printWriter.close();

Я получаю Exception: /sdcard/tempFifo: open failed: ENOENT (No such file or directory) в java Приложение и когда я выполнил ls -l /sdcard/tempFifo на оболочке adb, я не смог увидеть файл tempFifo на моей SD-карте телефона с рутом.

Кто-нибудь знает, в чем проблема в моем коде?

Обновление на errno

mkfifo ret -1
errno 22
errno str::Invalid argument

1 Ответ

1 голос
/ 23 января 2020

Android не позволяет создавать каналы на /sdcard, поэтому я использовал /system/tempFifo вместо /sdcard/tempFifo, чтобы он работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...