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);
}
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);
}
Dzięki za poprawienie, dodam jeszcze że może to być wykonane w c lub c++
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();
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?
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);
}
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());
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());
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.
A jak to zmienić na ubuntu?
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());
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);
}
-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
?
/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?
Ok to pozbędę się tego forka, ale nadal nie wiem co zrobić aby się kompilowało ;/
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.