Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

citanje system output-a (bez fajla) sa timeoutom

[es] :: C/C++ programiranje :: citanje system output-a (bez fajla) sa timeoutom

[ Pregleda: 1697 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

BurekUSvemiru
Petar Bojanic
Sremska Kamenica

Član broj: 47827
Poruke: 15
*.uns.ac.rs.



Profil

icon citanje system output-a (bez fajla) sa timeoutom31.08.2010. u 09:46 - pre 165 meseci
pozdrav dobri ljudi,
treba mi pomoc oko sleceg problema... dakle treba da procitam output sistemske komande bez da ga prosledim direktno u fajl (zabrana pisanja po sistemu). radim u linuxu. ono sto sam do sada saznao: sa system() to se ne moze uraditi, moze samo da se prosledi u fajl. sa popen() radi, ali ne mogu da kontrolisem proces, zapravo ne mogu da paralelno radim timeout i ubijem sistemski proces ako je potrebno... probao sam i sledece:

Code:
pid_t pID;
int cnt = 0;
FILE * fd_parser;
int status = 0;
int timeout= 60;
// input: "/home/media/mp3/mp3.mp3";
pID = fork();
if (pID == 0)                // child
{
// Code only executed by child process
char cmd[DATA_SIZE];
      sprintf(cmd, "mediainfo  \"%s\"", input);
      fd_parser = popen(cmd, "r");
      printf("child terminated.\n");
      _exit(0);
   }
   else if (pID < 0)            // failed to fork
   {
      printf("Fork failed.\n");
      exit(1);
   }
   else                                   // parent
   {
// Code only executed by parent process
      while(status != 1)
      {
         sleep(1);
         printf("status:%d\n", status);
         cnt++;
         if(cnt == timeout)
         {
            kill(pID, -9);
            printf("Failed\n");
            return 0;
         }
      }
   }


ali ovo puca u roku od odmah pre je na mestu popen() koriscen system sa upisom u fajl, a fd_parser se kasnije povezivao sa tim .txt fajlom, i to je radilo odlicno. ali ovde popijem segmentation fault. sta ciniti, ima li neko neku ideju?

hvala i pozdrav!
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.COOL.ADSL.VLine.Verat.NET.



+1 Profil

icon Re: citanje system output-a (bez fajla) sa timeoutom01.09.2010. u 13:23 - pre 165 meseci
Meni se ne javlja segmentation fault vec se dete proces vrti u petlji sa statusom 0.

popen() poziva fork() i time dobijas jos jedan proces ciji ID ne znas. Njegov ID mozes da nadjes tako sto ces proveriti koji proces je dete tvog procesa koje je pozvao popen(). (Nadam se da te nisam ovde zbunio.)

Elem, treba ti jos logika za timeout, to moze da ide preko postavljanje alarma u dete procesu pre nego sto pozoves popen(), nesto poput
Code:

if (pID == 0) // child
{
    struct sigaction signal_action;
    signal_action.sa_handler = stop_child;
    sigemptyset(&signal_action.sa_mask);
    sigaction(SIGALRM, &signal_action, NULL)
    alarm(60);

    // Code only executed by child process
    char cmd[DATA_SIZE];
    sprintf(cmd, "mediainfo  \"%s\"", input);
    fd_parser = popen(cmd, "r");
    printf("child terminated.\n");
    _exit(0);
}

Ostaje jos signal handler:
Code:

void stop_child(int sig_no)
{
    // find child generated by popen() and kill it
    // ...

    exit(EXIT_FAILURE);
}

Dakle, postavljanje alarma i obrada njegovog signala je laka ako hoces da ubijes dete proces nastalo tvojim forkovanjem. Medjutim, problem je sto u tvom dete procesu preko popen() stvoris jos jedan proces koji je dete tvog deteta. Njegovo nalazenje je trik, mozes da ga nadjes kao sto sam gore pokusao da objasnim.

Ovo je pisano iz glave, bez testiranja, javi ako negde zapne.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

[es] :: C/C++ programiranje :: citanje system output-a (bez fajla) sa timeoutom

[ Pregleda: 1697 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.