popen () alternativa

La mia domanda è l’estensione di questo: popen crea un ulteriore processo sh

Motives:

1) Il mio programma deve creare un bambino che faccia tail su un file. Ho bisogno di elaborare l’output riga per riga. È per questo che sto usando popen perché restituisce FILE *. Posso facilmente recuperare una linea, fare ciò che devo fare e stamparlo.

Un problema con popen è che non si ottiene il pid di child (comando tail nel mio caso).

2) Il mio programma non dovrebbe uscire prima che suo figlio abbia finito. Quindi ho bisogno di wait ; ma senza pid, non posso farlo.

Come posso raggiungere entrambi gli obiettivi?

Una ansible soluzione (kludge): esegui execvp (“tail -f file> tmpfile”) e continua a leggere il file tmp. Non sono sicuro di quanto sia buona questa soluzione, però.

Perché non stai usando il metodo pipe / fork / exec?

 pid_t pid = 0; int pipefd[2]; FILE* output; char line[256]; int status; pipe(pipefd); //create a pipe pid = fork(); //span a child process if (pid == 0) { // Child. Let's redirect its standard output to our pipe and replace process with tail close(pipefd[0]); dup2(pipefd[1], STDOUT_FILENO); dup2(pipefd[1], STDERR_FILENO); execl("/usr/bin/tail", "/usr/bin/tail", "-f", "path/to/your/file", (char*) NULL); } //Only parent gets here. Listen to what the tail says close(pipefd[1]); output = fdopen(pipefd[0], "r"); while(fgets(line, sizeof(line), output)) //listen to what tail writes to its standard output { //if you need to kill the tail application, just kill it: if(something_goes_wrong) kill(pid, SIGKILL); } //or wait for the child process to terminate waitpid(pid, &status, 0); 
  1. Puoi usare pipe , una funzione della famiglia exec* e fdopen . Questo non è standard, ma lo è anche per i popen .
  2. Non devi wait . Basta leggere la pipe fino a EOF .
  3. execvp("tail -f file > tmpfile") non funzionerà, il reindirizzamento è una caratteristica della shell e non stai facendo girare la shell qui. Anche se funzionasse, sarebbe una soluzione orribile. Supponiamo di aver letto fino alla fine del file, ma il processo figlio non è ancora terminato. cosa fai?

È ansible utilizzare wait in quanto non desidera che un PID attenda, ma attende semplicemente l’uscita di qualsiasi processo figlio. Se hai creato altri processi figli, puoi tenerne traccia e, se l’ wait restituisce un PID sconosciuto, puoi presumere che popen dal tuo processo di popen .

Non sono sicuro del motivo per cui hai bisogno dell’identificazione del processo del bambino. Quando il bambino esce, la tua lettura di pipe restituirà un EOF. Se hai bisogno di terminare il bambino, basta chiudere il tubo.