Funkcja system i równoległe wykonanie programu

0

witam,
czy istnieje możliwość aby wywołać funkcje system bez pauzowania wykonywanego programu? Coś jak poniżej aby wykonywała się współbierznie. Ewentualnie idzie to zrobić jakoś inaczej?

if(fork()=0)
{
    system(command);
    exit(0);
}
0

Dzięki za poprawienie, dodam jeszcze że może to być wykonane w c lub c++

1
std::future<int> fut = std::async(std::system, command);

Jeśli będziesz wymagał, żeby w danym momencie na pewno całość skończyła się wywoływać, to zawołaj:

int sys_result = fut.get();
0

a jak będę chciał aby wykonywanie tego zakończyło się po określonym czasie to zakończę je używając np kill?

0

Ok wielkie dzięki :) Jeszcze tylko ostatnie pytanie, czy mogę uruchmić to w ten sposób? Czy samo wywołanie tej funkcji tworzy współbieżnie nowy proces ?

if(fork()==0)
{
std::async(system,command);
}

0

Dostaję taki komunikat:

projektbezklas.cpp: In function ‘int main()’:
projektbezklas.cpp11: error: ‘future’ is not a member of ‘std’
std::future<int> fut = std::async(std::system, temporary.cstr());
^
projektbezklas.cpp23: error: expected primary-expression before ‘int’
std::future<int> fut = std::async(std::system, temporary.cstr());

0

mój błąd tam nie dodałem biblioteki future ale teraz mam coś takiego:

/usr/include/c++/5/bits/c++0x_warning.h2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support
^
projektbezklas.cpp: In function ‘int main()’:
projektbezklas.cpp11: error: ‘future’ is not a member of ‘std’
std::future<int> fut = std::async(std::system, temporary.cstr());
^
projektbezklas.cpp23: error: expected primary-expression before ‘int’
std::future<int> fut = std::async(std::system, temporary.cstr());

0

error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

0

A jak to zmienić na ubuntu?

0

A jak zrobić aby widział cstr ?

projektbezklas.cpp68: error: ‘std::string {aka class std::basic_string<char>}’ has no member named ‘cstr’
std::future<int> fut = std::async(std::system, temporary.cstr());

0

ehh znowu literówka.. Zmieniłem i dostaję teraz taki wywód:
/tmp/cc18D4lc.o: In function std::thread::thread<std::__future_base::_Async_state_impl<std::_Bind_simple<int (*(char const*))(char const*)>, int>::_Async_state_impl(std::_Bind_simple<int (*(char const*))(char const*)>&&)::{lambda()#1}>(std::__future_base::_Async_state_impl<std::_Bind_simple<int (*(char const*))(char const*)>, int>::_Async_state_impl(std::_Bind_simple<int (*(char const*))(char const*)>&&)::{lambda()#1}&&)': projektbezklas.cpp:(.text._ZNSt6threadC2IZNSt13__future_base17_Async_state_implISt12_Bind_simpleIFPFiPKcES5_EEiEC4EOS9_EUlvE_JEEEOT_DpOT0_[_ZNSt6threadC5IZNSt13__future_base17_Async_state_implISt12_Bind_simpleIFPFiPKcES5_EEiEC4EOS9_EUlvE_JEEEOT_DpOT0_]+0x7d): undefined reference to pthread_create'

kod:

   if(fork()==0)
        {
        while(getline(iss,temporary,';'))
        {
          std::future<int> fut = std::async(std::system, temporary.c_str());
          cout<< "utworzono"<<temporary<<endl;
        }
        exit(0);
      }
0

-lpthread do wywołania gcc. Ale mam inne pytanie: po kija Ci fork, skoro już masz async? Może chciałeś użyć exec zamiast system?

0

/tmp/ccNUAOMS.o: In function std::thread::thread<std::__future_base::_Async_state_impl<std::_Bind_simple<int (*(char const*))(char const*)>, int>::_Async_state_impl(std::_Bind_simple<int (*(char const*))(char const*)>&&)::{lambda()#1}>(std::__future_base::_Async_state_impl<std::_Bind_simple<int (*(char const*))(char const*)>, int>::_Async_state_impl(std::_Bind_simple<int (*(char const*))(char const*)>&&)::{lambda()#1}&&)': projektbezklas.cpp:(.text._ZNSt6threadC2IZNSt13__future_base17_Async_state_implISt12_Bind_simpleIFPFiPKcES5_EEiEC4EOS9_EUlvE_JEEEOT_DpOT0_[_ZNSt6threadC5IZNSt13__future_base17_Async_state_implISt12_Bind_simpleIFPFiPKcES5_EEiEC4EOS9_EUlvE_JEEEOT_DpOT0_]+0x7d): undefined reference to pthread_create'
collect2: error: ld returned 1 exit status

bo chciałem aby ten fork wywołał funkcję system a żeby główny wątek szedł sb niezależnie dalej, myślisz że bez tego forka też będzie ok?

0

Ok to pozbędę się tego forka, ale nadal nie wiem co zrobić aby się kompilowało ;/

0

async w tym przypadku to chyba jakieś nieporozumienie. Można czemu nie, tylko, że jest to zły kod, który może powodować w przyszłości pewne problemy. Async nie jest wywołaniem współbieżnym, tylko symuluje takie. Jest to wywołanie naprzemienne.
Jeśli chcesz wywołać kilka procesów jednocześnie to skorzystaj z mutexu oraz klasy thread lub zamiast mutexu było takie fajne rozwiązanie, niestety nie pamiętam (od standardu 11). System i tak uruchomi to po swojemu, ale zrobi to maksymalnie szybko. Nie będziesz miał tutaj dziwnych zachowań po stronie aplikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1