Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Spuštění externí aplikace z C++ programu a její ukončení [vyřešeno]  (Přečteno 5434 krát)

ondrejandrej

  • Aktivní člen
  • *
  • Příspěvků: 102
Ahoj,

potřebuji spouštět periodicky externí aplikaci z mého programu psaného v C++ a po nějaké době ji ukončit odesláním Ctrl-C. Zřejmě to nepude s funkcí system() z stdlib.h, protože volání této funkce můj program zastaví a program bude pokračovat až když externí aplikace sama skončí.

Máte nějaký nápad?
« Poslední změna: 15 Prosince 2010, 15:59:12 od Honza Grulich »
Kubuntu 18.04 na Thinkpadu T490

Martin - ViPEr*CZ*

  • Závislák
  • ***
  • Příspěvků: 3047
Zatím nechápu příliš takovou potřebu... ale napadlo mě třeba řešení:

- přes thread vlákno spustit tu danou aplikaci klidně přes system()
- pak přes jiné vlákno v určitý čas zavolat kill na tu danou aplikaci, která pak skončí

Bohužel neznáme přesnější specifikaci problému.

PS: měli by existovat (nevím teď z hlavy) nějaké exec metody kterým nezáleží kdy daná app skončí či jakým způsobem skončí... takže by daný thread nezablokovalo volání system(), které by si stále myslelo, že daná aplikace běží, i když by ji kill zrušil v jiném vláknu... říkám z hlavy neznám teorii... je to jen nástřel logiky  ;)
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

ondrejandrej

  • Aktivní člen
  • *
  • Příspěvků: 102

Díky, napadlo to i mně, ale zdá se, že lepší řešení je knihovna PStreams (http://pstreams.sourceforge.net/), která je založená na popen(). Jdu to s tím zkusit.
Kubuntu 18.04 na Thinkpadu T490

mk33

  • Aktivní člen
  • *
  • Příspěvků: 300
Co takhle: vytvořit nový proces v něm spustit Váš program a předat mu terminál?
int tcsetpgrp(int fildes, pid_t pgid);
začínám tak trpělivost a pevné nervy :-) since  21. Listopad 2006
-------------------------------------------------------------------------
|Aopen MX4SGI-4DN2|P4 2,8GHz HT|2x512MB RAM|ATI 9550|Linux Mint 9 Isadora|  |Asus P4B533|P4 1,8GHz|3x256 MB RAM|ATI 7500|Ubuntu 7.04|  |IBM Thinkpad T40p|Ubuntu 9.04|  |Lenovo Thinkpad T61|Linux Mint 9 Isadora|Lenovo Thinkpad T410|Linux Mint 13

ondrejandrej

  • Aktivní člen
  • *
  • Příspěvků: 102

Zatím se mi nepovedlo to rozběhat s popen(). Mezitím vám můžu objasnit, k čemu to potřebuji. Potřebuji v definovaném čase spustit pidgin, určitou dobu ho nechat spuštěn a potom ho ukončiť. Je to z toho důvodu, aby mě další uživatelé viděli jako přihlášeného v čase, který si určím.
Kubuntu 18.04 na Thinkpadu T490

ondrejandrej

  • Aktivní člen
  • *
  • Příspěvků: 102
takze lepsi a daleko verzatilnejsi je zabudovat si do sveho programu nejake jednoduche scripting API
- to jsem nepochopil.

Zatím mám tenhle program:
Kód: [Vybrat]
#include <iostream>
#include <stdio.h>

using namespace std;

int main(int argc, char **argv) {
    FILE * pidgin_inst;
    char retaz[10];
   
    retaz[0] = 'q';
    retaz[1] = '\0';
   
    pidgin_inst = popen("mplayer zvuky.mp3", "w");
   
    sleep(3);
   
    cout << "Ted poslu 'q'.\n";
    fprintf(pidgin_inst, "%s", retaz);
 
    sleep(3);
       
    cout << "Ted bude volání pclose()\n";
    pclose(pidgin_inst);
 
    return 0;
}
Chová se to takhle: je spuštěn mplayer, začne se přehrávat mp3. Po tří sekundách se vypíše "Ted poslu 'q'.", ale mplayer neskončí. Po šesti sekundách mplayer skončí (na volání pclose).

Otázka: proč neskončí na poslání q? Vždyť klávesou q se normálně ukončuje mplayer.
Kubuntu 18.04 na Thinkpadu T490

premet

  • Host
Podle mě to tímhle způsobem fungovat nebude, spíš bych na to šel bud v nějakým skriptovacím jazyce, klidně by se dalo něco sbastlit v Bashi nebo bych použil třeba vytvoření nového procesu přes fork() a pak jen nějakou funkci na ohlídání toho času a poslal pak signál k ukončení tomu procesu podle jeho PID.

Ale místo funkce system() bych použil nějakou z funkcí exec(), protože system() blokuje některé signály.
« Poslední změna: 15 Prosince 2010, 15:20:47 od Honza Grulich »

ondrejandrej

  • Aktivní člen
  • *
  • Příspěvků: 102

No tak dobře, klidně ve skriptovacím jazyce. Ale jak můžu ze skriptu ukončit aplikaci, která se neukončuje sama?
Kubuntu 18.04 na Thinkpadu T490

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072
> jak můžu ze skriptu ukončit aplikaci, která se neukončuje sama?

Kód: [Vybrat]
killall --signal SIGINT pidginhttp://www.abclinuxu.cz/clanky/unixove-nastroje-13-ps-kill-a-signaly

Martin - ViPEr*CZ*

  • Závislák
  • ***
  • Příspěvků: 3047

No tak dobře, klidně ve skriptovacím jazyce. Ale jak můžu ze skriptu ukončit aplikaci, která se neukončuje sama?
Určitě přes kill... i když nevidím důvod si stáhnout source pidginu a naprogramovat ho, že poběží přesně určený čas třeba podle parametru spuštění. Pak už ho jen přes cron v ten daný okamžik nechat spustit s oním parametrem a program se přesně v daný okamžik zapne... a poběží tak dlouho jaké bude číslo v parametru nějakém ;-)

PS: pacholik byl s killem rychlejší  ;D
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

premet

  • Host
Kód: [Vybrat]
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main()
{
    
     pid_t new_process;
    
     new_process = fork();

     if (!new_process) {

execl("/usr/bin/vlc", "vlc",(char *) 0);


     }
    
     sleep(3);
    
     kill(new_process,9);
    
     return 0;
    
}

ondrejandrej

  • Aktivní člen
  • *
  • Příspěvků: 102

Ten příkaz s killall funguje, děkuji všem za pomoc. Ten céčkový kód možná taky někdy využiju.
Kubuntu 18.04 na Thinkpadu T490

 

Provoz zaštiťuje spolek OpenAlt.