Jag har slitit ett tag med ett jobbigt problem. Jag har en modul som jag använder för att göra GUI-wrappers till CLI-program. (I synnerhet är det hjärtat i den utvecklingmiljö jag utvecklar. Jag både kör kompileringar, filkopieringar och exekverar det resulterande programmet genom den.)
Allt funkar jättebra i Tiger. När barnprocessen stannar så dör den inte från förälderns synvinkel förrän alla data är utlästa. Perfekt. Men i Leopard så bara tvärdör den, och man kan inte läsa ut något alls!
Jag hoppas att det bara är någon flagga jag måste sätta eller något sådant. Finns det någon som känner igen problemet?
Bland det jag testat: signalhantering av SIGCHLD (signalen går fram men för sent, data är redan borta), SIGIO (signalen går inte fram alls), läsa av pty'n tills jag får inget och då testa med waitpid() (funkar enbart om jag pollar som en galning), etc etc.
Jag använder alltså forkpty(). Man kan tro att fork/pipe/exec skulle duga, men det funkar inte för dubbelriktad kommunikation. För enkelriktad går det någorlunda, men man får data klumpvis. Nej, inte bra. Bättre med forkpty() och det är vad böckerna säger också.
Om jag bara kan komma så långt att jag kan starta ett "hello world" och få hela utdata (dvs "hello world") enkelt och säkert utan att polla som en skållad råtta, då tror jag att problemet är löst. Men hur gör man?
Jag är ju inte den ende som gör program som anropar CLI-program heller! Någon som vet mer?