Domanda

Voglio eseguire il programma come demone in macchina remota in Unix. Ho collegamento rsh e voglio il programma per essere in esecuzione dopo la disconnessione.

Supponiamo che io ho due programmi:. Util.cpp e forker.cpp

util.cpp è qualche utilità, per il nostro scopo lascia che sia solo radice infinita.

util.cpp

int main() {
    while (true) {};
    return 0;
}

forker.cpp richiede del programma ed eseguirlo nel processo separe attraverso fork () e execve ():

forker.cpp

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char** argv) {
  if (argc != 2) {
    printf("./a.out <program_to_fork>\n");
    exit(1);
  }

  pid_t pid;

  if ((pid = fork()) < 0) {
    perror("fork error.");
    exit(1);
  } else if (!pid) {
    // Child.
    if (execve(argv[1], &(argv[1]), NULL) == -1) {
      perror("execve error.");
      exit(1);
    }
  } else {
    // Parent: do nothing.
  }
  return 0;
}

Se corro:

./forker util

forker è finito molto in fretta, e bash 'non sia in pausa', e util è in esecuzione come demone.

Ma se corro:

scp forker remote_server://some_path/
scp program remote_server://some_path/
rsh remote_server 'cd /some_path; ./forker program'

, allora è lo stesso (cioè al forker remote_sever sta finendo rapidamente, util è in esecuzione), ma la mia bash in macchina locale è in pausa. Si è in attesa di util arresto (ho controllato. Se util.cpp sta tornando quello che è ok.), Ma non capisco perché?!

Ci sono due domande:

1) Why is it paused when I run it through rsh?

Sono sicuro che ho scelto un modo stupido per eseguire il demone. Quindi

2) How to run some program as daemon in C/C++ in unix-like platforms.

Tnx!

È stato utile?

Soluzione

  

1) Perché è in pausa quando l'eseguo attraverso rsh?

Quando si fork di un processo, il processo figlio ha la propria copia di descrittori di file del genitore. Ognuno dei descrittori di file del bambino si riferisce alla stessa descrizione file aperto con il corrispondente descrittore di file del genitore. Dopo aver chiamato fork() non si sta chiudendo i flussi standard (stdin, stdout, stderr) nel processo figlio prima della chiamata a execve() in modo che siano ancora collegati a rsh. Può essere il caso che rsh non tornerà finché qualsiasi processo sul server remoto è in possesso di un riferimento a tali flussi. Si potrebbe provare a chiudere i flussi standard utilizzando fclose() prima della chiamata a execve() o redirect quando si esegue il programma di forker (cioè ./forker program >/dev/null 2>/dev/null </dev/null).

  

2) Come eseguire qualche programma come demone in C / C ++ in unix-like piattaforme.

wikipedia , nohup è più spesso utilizzato per eseguire comandi in background come demoni. Ci sono anche diverse demone questioni connesse su questo sito è possibile fare riferimento per informazioni.

wikipedia :

  

nohup è un comando POSIX per ignorare il segnale HUP (hangup), che consente il comando di continuare a correre dopo che l'utente che invia il comando è disconnesso. Il segnale HUP (hangup) è per convenzione il modo in cui un terminale avverte seconda processi di disconnessione.

Se il programma sarà sempre eseguito come un demone, è possibile esaminare la possibilità di chiamare daemon() dall'interno del programma. La funzione daemon() convenienza esiste in alcuni sistemi UNIX.

daemon (3) man page :

  

La funzione daemon () è per programmi che vogliono staccarsi dal terminale di controllo ed eseguire sullo sfondo come demoni di sistema.

Qualora questa funzione non esiste per voi o ci dovrebbe essere casi in cui il programma non viene eseguito come un demone, il programma forker può anche essere modificato per 'demonizzare' il tuo altro programma.


senza apportare alcuna modifica al codice, si potrebbe provare qualcosa di simile al seguente:

rsh remote_server 'cd /some_path; nohup ./forker program >program.out 2>program.err </dev/null &'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top