LINUX.ORG.RU

fifo между wine приложением и не wine

 ,


0

2

Добрый день. Нужно обмениваться данными между двумя приложениями - одно из них скомпилировано через wineg++. Без использования wineg++ проблем не возникает.

// LOCALSTATEDIR = "/usr/local/xstow/wtr/var/wtr"
// не вайн
int main()
{
    int pipe = open(LOCALSTATEDIR "/pipe", O_WRONLY);
    char buf[10];
    if( write(pipe, buf, 10) != 10 )
        throw std::logic_error("error");
    std::cout << "write ok" << std::endl;
    while(true);
    return 0;
}

// вайн
int main()
{
    mkfifo(LOCALSTATEDIR "/pipe", 0666);
    int pipe = open(LOCALSTATEDIR "/pipe", O_RDONLY);

    fd_set set;
    FD_ZERO(&set);
    FD_SET(pipe, &set);
    char buf[10];
    while(true)
    {
        Sleep(100);
        timeval tval{0, 0};
        switch( select(pipe + 1, &set, NULL, NULL, &tval) )
        {
            case 1:
                std::cout << "\ncase == 1 - " << read(pipe, buf, 10) << std::endl;
                break;
            case 0:
//                std::cout << "\ncase == 0 - ";
                break;
            default:
                throw std::logic_error("error");
        }
    }
    return 0;
}

Пишущая сторона отчитывается о записи (write ok), вторая сторона не попадает в case 1. Как сказал выше, без вайна данные перебрасываются. Может кто сталкивался, в чём может быть проблема?

Ответ на: комментарий от Sorcerer

Я понял так, что FD_ISSET() вернёт истину для соответствующих элементов. В любом случаи, пробовал перенести формирование fd_set в цикл - результата нет.

pavlick ★★ ()
Ответ на: комментарий от pavlick

пробовал перенести формирование fd_set в цикл

Это однозначно нужно делать перед каждым вызовом select().

Sorcerer ★★★★★ ()

Можно и через обычный stdin/stdout, создать пайп в фс, и скармливать туда редиректом весь выхлоп.

tensai_cirno ★★★★★ ()

Виндовый select только на сокетах работает. Какой используется у тебя, вопрос.

Deleted ()
Ответ на: комментарий от Deleted

Похоже, что так есть. Не знал что в вин апи есть функция близнец.

pavlick ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.