• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Limit czasu działania programu

Object Storage Arubacloud
0 głosów
450 wizyt
pytanie zadane 13 czerwca 2017 w C i C++ przez niezalogowany

Witam, tworzę projekt, który będzie wykorzystywał limit czasu działania odpalonego programu. Czyli tak: Program sprawdzający odpala program komendą:

system("./a");

Teraz chciałbym dodać limit czasy, ale próbowałem tak:

Odpalam program komendą bash:

time ./a

z odpowiednimi parametrami. Ale to rozwiązanie ma jedną wadę:

Jeśli program jest słaby to może działać minutę, a limit to np. 10 sekund.

Chciałbym również aby, jak program zakończy działanie przed limitem np. 10 sekund to nie czekało dalej do pełnych 10 sekund.

Chodzi mi o to aby nie było takiego rozwiązanie, że program jest odpalany w tle timer i jeśli timer ma 10 sekund to wysyła sygnał zamknięcia, jeśli się udało to znaczy, że przekroczył limit, jak nie to nie.

2 odpowiedzi

0 głosów
odpowiedź 13 czerwca 2017 przez Benek Szeryf (91,010 p.)

Najłatwiej byłoby kontrolować cały proces zewnętrznym programem. Do tego celu świetnie się nadaje bash. Zasada działania jest bardzo prosta, uruchamiasz skrypt napisany w bashu, który to odpala interesujący Cię program. Po określonym czasie skrypt ubija proces odpalonego wcześniej programu. Napisałem taki software_killer.bash i przetestowałem:

#!/usr/bin/env bash

delay=10 # ustawienie opóźnienia w sekundach
./$1 &
sleep $delay
processID=`ps aux | awk '{if ($11 ~/'$1'/) print $2}'`
kill -9 ${processID}

Uruchamia się go tak z linii komend:

bash software_killer.bash nazwa_programu

Warunek jest taki, by uruchamiany program również znajdował się w katalogu roboczym. Jeśli będzie siedział w lokalizacji wskazanej przez zmienną $PATH to wystarczy pozbyć się znaków ./ z 4. linii skryptu.

komentarz 13 czerwca 2017 przez niezalogowany
Tyle, że jak pisałem, nie chciałem aby, jak program działa 0,5 sekundy to i tak muszę czekać do 10 sekund. Troszkę bez sensu. Mogłoby by tak, że jak tam jest ./$1 to jeszcze do tego dodać jakiś kodzik, który zabija ten program. Ten bash, przed tą operacją drugą.
komentarz 13 czerwca 2017 przez Benek Szeryf (91,010 p.)
Dlaczego bez sensu? Jeśli program zakończy działanie po 3 sekundach, to po 10 sekundach skrypt już nie odnajdzie identyfikator tego programu. Na nic nie musisz czekać, ten skrypt jest na tyle lekki, że nie obciąża systemu. Może działać w tle te 7 dodatkowych sekund, a Ty możesz uruchomić skrypt ponownie w tym czasie.
komentarz 13 czerwca 2017 przez adrian17 Ekspert (344,860 p.)
man timeout
komentarz 13 czerwca 2017 przez mokrowski Mędrzec (155,460 p.)
A nie

man 3 ulimit

? :-)
komentarz 13 czerwca 2017 przez adrian17 Ekspert (344,860 p.)
Nie, timeout liczy czas zegarowy, a ulimit czas CPU.
komentarz 13 czerwca 2017 przez mokrowski Mędrzec (155,460 p.)
No właśnie pytający powinien wiedzieć o jakie ograniczenie pyta. Jeśli to program do sprawdzania zadań algorytmicznych to raczej CPU i ulimit. Jeśli natomiast "program ogranicznik" to raczej timeout lub rozwiązanie systemowe z rejestracją timerów..... albo to "kulawe coś" co umieściłem poniżej w odpowiedzi :-/

Dodatkowo w rozwiązaniu z ulimit dostarczany będzie sygnał XCPU który można przejąć w docelowym programie/skrypcie i sensownie reagować (lub domyślnie bez co równoznaczne będzie z terminacją).
komentarz 14 czerwca 2017 przez niezalogowany

@adrian17 Użyłem dla przykładu:

timeout -k 1 z

z to program skompilowany. Wyświetla się:

Napisz „timeout --help” dla uzyskania informacji.

A tam postępowałem według składni.

0 głosów
odpowiedź 13 czerwca 2017 przez mokrowski Mędrzec (155,460 p.)

Z tym system, to jest średni pomysł ze względu na bezpieczeństwo. Ale zapewne na tym etapie to nie jest największy problem :-)

#include <iostream>
#include <thread>
#include <chrono>
#include <future>
#include <cstdlib>

int main() {

    // Tu się baw i sprawdź czasy... 
    constexpr static unsigned launch_time = 1;
    constexpr static unsigned wait_time = 2;

    auto status = std::future_status{};

    auto ftr = std::async(std::launch::async, []() {
            // Symulacja wykonania komendy... 
            std::system((std::string("sleep ")
                        + std::to_string(launch_time)).c_str());
    });

    status = ftr.wait_for(std::chrono::seconds(wait_time));

    if(status == std::future_status::ready) {
        std::cout << "Program zakończył się w oknie czasu." << std::endl;
        ftr.get();
    } else {
        std::cout << "Niestety program NIE zakończył się w oknie czasu."
            << std::endl;
    }

    // Ze względu na potencjalny future który może jeszcze pracować... 
    std::exit(EXIT_SUCCESS);
}

 

Podobne pytania

0 głosów
1 odpowiedź 426 wizyt
pytanie zadane 30 kwietnia 2017 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 650 wizyt
pytanie zadane 23 października 2016 w C i C++ przez Elenek Nowicjusz (160 p.)
0 głosów
1 odpowiedź 790 wizyt
pytanie zadane 9 lutego 2016 w C i C++ przez adojado Początkujący (420 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...