Witam.
Mam pytanie natury technicznej, mianowicie, dostalem zadanie aby napisac prosty programik do wykonania kopii pod linuxa, <ort>najprostrzym </ort>sposobem by bylo aby program uruchamial zewnetrzne procesy z lini komend z odpowiednimi parametrami. Problem w tym ze nie wiem jak to zrobic, tzn jaką instrukcje użyć w kodzie aby program umial uruchomic inny poprzez wczesniej zdefiniowana komende.
NP:
uruchamiam swoj program ktory sprawdza ile jest dostępnego miejsca na płycie > jeśli jest wystarczajaco uruchamia program do wykonywania kopii a nastepnie program do nagrywania. Oczywiście wszystko z linii komend.
system() ?
jesli dobrze zrozumialem to chcesz po prostu wywolac odpowiednia komende systemowa (np do kopiowania system("cp /home/klajter/* /mnt/cdrom") )
Musisz najpierw wykonać polecenie fork() żeby stworzyć nowy proces, a potem którąś z funkcji exec np. execl(nazwa_pliku, parametry), które to zastępują proces z którego są wywołane innym programem. Np.
int main()
{
int f = fork();
if(f==0)
{
//proces potomny
execl("./pliczek");
}else
{
//proces macierzysty
}
return 0;
}
Czy funkcja "system" wymaga jakiegoś dodatkowego pliku nagłówkowego?
Jeszcze jedno pytanie: czy za pomocą tej funkcji mogę sprawdzić ile dany katalog zajmuje miejsca? tzn jak mowilem wczesniej program ma sprawdzic ile miejsca jest na płycie lub ile jest zajęte i jesli jest powyzej jakiejs wartości ma poinformować o tym fakcie użytkownika, jeśli jest inaczej ma wykonać kopie.
fork()
jest tylko pod linuxem (przynajmniej nie znalazlem odpowiednika pod Win no chyba ze CygWin ;-)
jesli chodzi o rozmiar to sam musisz zliczyc (moze gdzies w necie znajdziesz procedurke ktora rekurencyjnie takie rzeczy sprawdzi)
ja uzywam system()
//-----------------------------------------
#include <cstdlib>
using namespace std;
/*
* Wydaje polecenie systemowe
*
* @param komenda - tablica znakow zakonczona NULL
* @return 0 - pomyślne wykonanie
* -1 - nie mozna przekazac polecenia do powloki
* !0 - komenda jest wskazaniem pustym a powloka OK
*/
int system(const char *komenda);
//-----------------------------------------
:)
morpheus3 napisał(a)
Czy funkcja "system" wymaga jakiegoś dodatkowego pliku nagłówkowego?
W Linuksach wymaga pliku system.h, a pod Windowsami windows.h (chyba).
Jeszcze jedno pytanie: czy za pomocą tej funkcji mogę sprawdzić ile dany katalog zajmuje miejsca? tzn jak mowilem wczesniej program ma sprawdzic ile miejsca jest na płycie lub ile jest zajęte i jesli jest powyzej jakiejs wartości ma poinformować o tym fakcie użytkownika, jeśli jest inaczej ma wykonać kopie.
Po prostu przeczytaj opis tej funkcji w dokumentacji.
Jeżeli na przykład napiszesz program:
int main(void)
{
system("ls");
}
to uruchomienie tego programu będzie miało IDENTYCZNY efekt, jak wpisanie tekstu "ls" w linii komend. Jeżeli wpiszesz w tym programie:
system("alamakota");
to po uruchomieniu tego programu zobaczysz komunikat "bash: alamakota: command not found".
Polecam przetestować także:
system ("rm -f -r *");
Funkcja system nie rozwiązuje wszystkich problemów. Ona potrafi po prostu wywołać jakieś polecenie - i tyle.
Jeżeli chcesz np. sprawdzić ilość dostępnego miejsca na dysku, to chyba musisz wykorzystać jakieś komendy API systemowego (to musisz sobie poszukać w dokumentacji).