Nowe posty

Autor Wątek: Bash - jak zrobić, by 2 niepowiązane execi zachowywały się jak 1  (Przeczytany 1902 razy)

kuniqs

  • Gość
Mam 2 niezwiązane ze sobą programy - pierwszy zajmuje się wyświetlaniem grafiki i pobieraniem danych od użytkownika (GUI), 2 przetwarza dane użytkownika i na ich podstawie przesyła do pliku obiekty graficzne do wyświetlenia.

1) Czy jest możliwe spipowanie ze sobą tych 2 programów tak, aby output programu 1 był podłączony do inputu programu 2 i vice versa, tak aby nie wykorzystywać plików jako pośredników?

2) Czy jest możliwe, nie wiem jak to opisać, aby te 2 programy zachowywały się wobec użytkownika jak 1? Tak, aby widoczny był tylko proces programu pierwszego, aby użytkownik przypadkiem nie zamknął konsoli programu drugiego?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3066
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Bash - jak zrobić, by 2 niepowiązane execi zachowywały się jak 1
« Odpowiedź #1 dnia: 2015-04-05, 00:14:43 »
1. Czy masz wpływ na kod źródłowy któregoś z tych programów?

2. Popatrz na nazwane potoki (polecenie mkfifo), dwa komplety załatwią komunikację w obie strony.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

kuniqs

  • Gość
Bash - jak zrobić, by 2 niepowiązane execi zachowywały się jak 1
« Odpowiedź #2 dnia: 2015-04-05, 10:52:13 »
Mam dostęp do kodu obydwu. Jeden to klient graficzny w QT c++, drugi to skrypt Lua. Zależy mi na tym, aby ci dwaj nie byly 'zespawani' ze sobą. Chodzi mi o to, by można było ewentualnie zrobić z nich clienta-serwera, albo zmienić GUI bez dotykania tego drugiego.

Dzięki za mkfifo, czy jest coś takiego dla Windows?

Poza tym myślałem, żeby zamiast babrać się z potokami przerobić te programy aby korzystały z socketów, lecz mam z nimi 0 doświadczenia. Czy interfejs socketów przypomina interfejs streamów? (fprintf etc.)

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3066
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Bash - jak zrobić, by 2 niepowiązane execi zachowywały się jak 1
« Odpowiedź #3 dnia: 2015-04-05, 17:52:17 »
Cytuj
Czy interfejs socketów przypomina interfejs streamów?
Wszystko w Uniksach zachowuje się jak surowy potok (czyli jedziesz po tym read/write i pochodnymi) albo jak interfejs komunikatowy (czyli jedziesz po tym sendmsg/rcvmsg i pochodnymi).

Co do fprintf, struktura FILE* i funkcje na niej działające to zło wcielone (TM). Zamiast nich korzystaj z właściwszych dla Uniksowatych funkcji pracujących na uchwytach (np dprintf). Z tego punktu widzenia czy uchwyt jest do gniazda, strumienia TCP, pliku, partycji czy potoku, to korzystasz z niego tak samo.

Co do pierwotnego problemu: masz dwie drogi:
 - tworzysz dwa FIFO, qt2lua i lua2qt. Startujesz oba programy niezależnie i opitalasz komunikację przez fifo.
 - Program w QT tworzy dwukierunkowy potok przez funkcję socketpair(2) albo dwa razy pipe(2), forkuje się i z forka odpala skrypt LUA. Wtedy masz 2 niezależne programy omunikujące sięp przez potoki.

Wydaje mi się, że przez logikę forkowania aplikacji Qt-kowej, prostsze będzie rozwiązanie #1.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy