2009-12-17 11 views
13

Non sono sicuro se usare pty.fork() o os.fork() quando si generano processi in background esterni dalla mia app. (Come i motori di scacchi)Python: quando usare pty.fork() contro os.fork()

Voglio che i processi generati muoiano se il genitore viene ucciso, come con le app di generazione in un terminale.

Quali sono gli alti e bassi tra le due forcelle?

risposta

10

Il processo figlio creato con os.fork() eredita lo stdin/stdout/stderr dal processo padre, mentre il figlio creato con pty.fork() è connesso al nuovo terminale pseudo. È necessario il successivo quando si scrive un programma come xterm: pty.fork() nel processo padre restituisce un descrittore per controllare il terminale del processo figlio, in modo da poter rappresentare visivamente i dati da esso e tradurre le azioni dell'utente in sequenze di input del terminale.

Aggiornamento:

Da pty (7) pagina man:

Un processo che prevede di collegare ad un terminale, può aprire fine lo schiavo di una pseudo-terminale e quindi essere guidato da un programma che ha aperto la fine principale. Tutto ciò che è scritto sull'estremità master è fornito al processo sullo slave come se fosse stato digitato in input su un terminale. Ad esempio, scrivendo il carattere interruzione (di solito controllo-C) al dispositivo master causerebbe un segnale di interrupt (SIGINT) per generare per il gruppo di processi piano che è collegata allo slave. Al contrario, lo slave dello pseudo-terminale, , può essere letto dal processo che è connesso al master.

+0

Quindi lo scopo della pty è di mantenere l'IO figlio in una casella separata, invece di confonderlo con i genitori stdin/out? Suppongo che potresti fare lo stesso con os.fork e alcuni pibes. Questo terminale fa qualcosa di diverso dall'IO? –

+0

Certo, puoi implementare 'pty.fork()' usando 'pty.openpty()' e 'os.fork()' (in realtà puoi vederlo nella sorgente 'pty.py'). Ma lo pseudo-terminale differisce dalle pipe, vedi http://en.wikipedia.org/wiki/Pseudo_terminal. –

+0

In pty.py vedo che anche il codice non os.forkpty in pty.fork usa il dispositivo/dev/pty, quindi deve esserci più di un paradigma di input/output. Leggo i commenti nella parte superiore del file e dicono: "Bug: nessuna gestione del segnale. Non imposta i termios slave e le dimensioni della finestra". Wikipedia non ha detto nulla su Pty sta facendo cose del genere .. –

3

In passato ho sempre utilizzato il modulo subprocess per questo. Fornisce una buona api per comunicare con i sottoprocessi.

È possibile utilizzare call(*popenargs, **kwargs) per bloccarne l'esecuzione e credo che l'utilizzo della classe Popen possa gestire l'esecuzione asincrona.

Per ulteriori informazioni, consultare lo docs.

Per quanto riguarda l'utilizzo di os.fork rispetto a pty.fork, entrambi sono altamente dipendenti dalla piattaforma e nessuno funzionerà (o almeno è testato) con Windows. Il modulo pty sembra essere il più vincolato tra i due leggendo i documenti. La principale differenza è l'aspetto pseudo-terminale. Quindi se non sei disposto ad architettare il tuo codice in modo tale da poter usare il modulo subprocess, probabilmente andrei con os.fork invece di pty.fork.

+0

In realtà è esattamente l'aspetto "pseudo terminale" di cui vorrei sapere di più. Ho letto molti dei documenti del kernel e mans, ma non ho scoperto esattamente quando dovrei usare la strega .. –

+0

Dalla lettura che ho fatto parla di essere in grado di fare input/output al terminale del processo tramite codice. Quindi questo per me sembra un paradigma separato dall'uso di stdout/stdin per comunicare con l'applicazione. Maggiori informazioni sul concetto di pseudo terminale qui: http://en.wikipedia.org/wiki/Pseudo_terminal –

+0

Quando leggo wikipedia, le cuciture pseudo-terminali sono solo un'alternativa alle pipe. Quando dici "input/output tramite codice", intendi roba come delete e inset, o solo standard di lettura/scrittura come una pipe? –

2

Le pseudotermiche sono necessarie per alcune applicazioni che prevedono realmente un terminale. Una shell interattiva è uno di questi esempi, ma ce ne sono molti altri. L'opzione pty.fork non esiste come un altro os.fork ma come una specifica API per utilizzare uno pseudoterminale.

Problemi correlati