Glib :: iochannel의 두 가지 인스턴스가 있으면 두 글로 작성 될 때까지 차단됩니다. 이것을하는 올바른 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1043588

  •  20-08-2019
  •  | 
  •  

문제

찾은 예제를 수정했습니다 여기 두 개의 IO 채널을 사용합니다. 두 채널에 글을 쓰기 전에 콜백 중 어느 것도 호출되지 않은 것 같습니다. 그 후 그들은 FIFOS에 글을 쓸 때 개별적으로 부름을받습니다. 뭔가 잊고 있는가?

  • 하나의 쉘 창에서 테스트 프로그램을 시작하십시오.
  • 두 번째 쉘 창에 echo "abc"> testfifo1을 쓰십시오. -> 아무 일도 일어나지 않습니다.
  • 세 번째 쉘 창에 echo "def"> testfifo2를 씁니다. -> 이제 "ABC"와 "def"를 얻습니다.
  • FIFO 중 하나에 쓰십시오. 이것은 즉시 제공됩니다.

편집 : 아래 Gormley가 암시 한 솔루션은 비 블록이 부족했습니다.

read_fd1 = open("testfifo1", O_RDONLY | O_NONBLOCK);
...
read_fd2 = open("testfifo2", O_RDONLY | O_NONBLOCK);

아래 코드로 변경하면 즉시 응답했습니다.

코드:

#include <gtkmm/main.h>
#include <fcntl.h>
#include <iostream>

int read_fd1, read_fd2;
Glib::RefPtr<Glib::IOChannel> iochannel1, iochannel2;

// Usage: "echo "Hello" > testfifo<1|2>", quit with "Q"

bool MyCallback1(Glib::IOCondition io_condition)
{
    Glib::ustring buf;
    iochannel1->read_line(buf);
    std::cout << "io 1: " << buf;

    if (buf == "Q\n")
        Gtk::Main::quit();

    return true;
}

bool MyCallback2(Glib::IOCondition io_condition)
{
    Glib::ustring buf;
    iochannel2->read_line(buf);
    std::cout << "io 2: " << buf;

    if (buf == "Q\n")
        Gtk::Main::quit();

    return true;
}

int main(int argc, char *argv[])
{
    // the usual Gtk::Main object
    Gtk::Main app(argc, argv);

    if (access("testfifo1", F_OK) == -1)
    {
        if (mkfifo("testfifo1", 0666) != 0)
            return -1;
    }

    if (access("testfifo2", F_OK) == -1)
    {
        if (mkfifo("testfifo2", 0666) != 0)
            return -1;
    }

    read_fd1 = open("testfifo1", O_RDONLY);

    if (read_fd1 == -1)
        return -1;

    read_fd2 = open("testfifo2", O_RDONLY);

    if (read_fd2 == -1)
        return -1;

    Glib::signal_io().connect(sigc::ptr_fun(MyCallback1), read_fd1, Glib::IO_IN);
    Glib::signal_io().connect(sigc::ptr_fun(MyCallback2), read_fd2, Glib::IO_IN);

    iochannel1 = Glib::IOChannel::create_from_fd(read_fd1);
    iochannel2 = Glib::IOChannel::create_from_fd(read_fd2);

    app.run();

    if (unlink("testfifo1"))
        std::cerr << "error removing fifo 1" << std::endl;

    if (unlink("testfifo2"))
        std::cerr << "error removing fifo 2" << std::endl;

    return 0;
}
도움이 되었습니까?

해결책

이 두 진술은 두 FIFO가 모두 쓰기를 위해 열려있을 때까지 프로그램이 메인 루프에 들어가는 것을 차단합니다. 양쪽이 연결될 때까지 FIFOS 블록

iochannel1 = glib :: iochannel :: create_from_fd (read_fd1); iochannel2 = glib :: iochannel :: create_from_fd (read_fd2);

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top