semplice esempio, che non funziona sulla mia piattaforma (Ruby 2.2
, Cygwin
):Ruby - fork, exec, staccare .... abbiamo una condizione di gara qui?
#!/usr/bin/ruby
backtt = fork { exec('mintty','/usr/bin/zsh','-i') }
Process.detach(backtt)
exit
Questo piccolo programma (quando è partito dalla shell) dovrebbe estendersi su una finestra di terminale (mintty) e poi prendermi torna al prompt della shell.
Tuttavia, sebbene crei la finestra di mintty, non ho un prompt di shell in seguito, e non posso digitare nulla nella shell di chiamata.
Ma quando introduco un piccolo ritardo prima che il distacco, sia utilizzando 'sonno', oppure stampando qualcosa su stdout, esso funziona come previsto:
#!/usr/bin/ruby
backtt = fork { exec('mintty','/usr/bin/zsh','-i') }
sleep 1
Process.detach(backtt)
exit
Perché è necessario?
proposito, sono ben consapevole che ho potuto (dal guscio) fare una
mintty /usr/bin/zsh -i &
direttamente, o potrebbe usare sistema (...... &
) dall'interno rubino, ma questo non è il punto qui. Sono particolarmente interessato al comportamento di fork/exec/detach
in Ruby. Qualche intuizione?
Sebbene nessuno specialista per Ruby, e non conoscendo affatto Cygwin, questa situazione mi sembra molto familiare (proveniente da c (++)): Questo script è troppo breve :-) - cosa succede se metti il dormire dopo distaccarsi e prima di uscire? – halfbit