lszk Napisano Sierpień 3, 2006 Zgłoszenie Share Napisano Sierpień 3, 2006 Napisałem sobie taki malutki programik z użyciem m. in. fork(). Jednak nie jestem do końca przekonany, czy ten fork jest akurat przydatny w sposób, który użyłem. Może lepiej byłoby, gdyby go usunąć? Tak się nad tym zastanawiam :| Ewentualne zmiany w kodzie mile widziane. #include <iostream> #include <string> #include <unistd.h> #include <sys/types.h> #include <cstdlib> using namespace std; void _zip(char** arg_list){ pid_t child = fork(); if(child == 0) execvp("unzip", arg_list); else abort(); } void _rar(char **arg_list){ pid_t child = fork(); if(child == 0) execvp("unrar", arg_list); else abort(); } void _targz(char **arg_list){ pid_t child = fork(); if(child == 0) execvp("tar", arg_list); else abort(); } void _tarbz2(char **arg_list){ pid_t child == fork(); if(child == 0) execvp("tar", arg_list); else abort(); } enum rozsz {zip=7367034, rar=7496050, targz=31335, tarbz2=3308130}; int main(int argc, char *argv[]){ if(argc < 2){ cout << "Usage: " << argv[0] << " archive.(rar, zip, tar.gz, tar.bz2)" << endl; exit(1); } char* arg_list_zip[] = { "unzip", "-x", argv[1], NULL }; char* arg_list_rar[] = { "unrar", "e", argv[1], NULL }; char* arg_list_tarbz2[] = { "tar", "-jxvf", argv[1], NULL }; char* arg_list_targz[] = { "tar", "-zxvf", argv[1], NULL }; string path; path = argv[1]; string::size_type x = path.find_last_of('.'); if(x == string::npos){ cout << "Nierozpoznany format pliku" << endl; exit(1); } string filetype; filetype = path.substr(x+1); int rotfl_int = 0; rotfl_int = *((int*)filetype.c_str()); switch(rotfl_int){ case zip: _zip(arg_list_zip); break; case rar: _rar(arg_list_rar); break; case targz: _targz(arg_list_targz); break; case tarbz2: _tarbz2(arg_list_tarbz2); break; default: cout << "Nieznany format pliku" << endl; exit(1); break; } } Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Sanczo Napisano Sierpień 4, 2006 Zgłoszenie Share Napisano Sierpień 4, 2006 Wedlug mnie niepotrzebnie mieszasz do tego fork. Skoro juz rozpoznasz archiwum to rozpakowujesz je z poziomu gownego procesu, ktory juz wiecej nic do zrobienia nie ma. Wyglada to tak: (wywalilem wszystkie fork'i i wiekszosc naglowkow) #include <iostream> #include <string> using namespace std; void _zip(char** arg_list){ execvp("unzip", arg_list); } void _rar(char **arg_list){ execvp("unrar", arg_list); } void _targz(char **arg_list){ execvp("tar", arg_list); } void _tarbz2(char **arg_list){ execvp("tar", arg_list); } enum rozsz {zip=7367034, rar=7496050, targz=31335, tarbz2=3308130}; int main(int argc, char *argv[]){ if(argc < 2){ cout << "Usage: " << argv[0] << " archive.(rar, zip, tar.gz, tar.bz2)" << endl; exit(1); } char* arg_list_zip[] = { "unzip", "-x", argv[1], NULL }; char* arg_list_rar[] = { "unrar", "e", argv[1], NULL }; char* arg_list_tarbz2[] = { "tar", "-jxvf", argv[1], NULL }; char* arg_list_targz[] = { "tar", "-zxvf", argv[1], NULL }; string path; path = argv[1]; string::size_type x = path.find_last_of('.'); if(x == string::npos){ cout << "Nierozpoznany format pliku" << endl; exit(1); } string filetype; filetype = path.substr(x+1); int rotfl_int = 0; rotfl_int = *((int*)filetype.c_str()); switch(rotfl_int){ case zip: _zip(arg_list_zip); break; case rar: _rar(arg_list_rar); break; case targz: _targz(arg_list_targz); break; case tarbz2: _tarbz2(arg_list_tarbz2); break; default: cout << "Nieznany format pliku" << endl; exit(1); break; } } i dziala jak nalezy. pozdrawiam Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
lszk Napisano Sierpień 5, 2006 Autor Zgłoszenie Share Napisano Sierpień 5, 2006 No tak się spodziewałem po prawdzie Chciałem po prostu troche poćwiczyć z forkiem, ale jakiegoś przykładu nie potrafiłem wymyślić. A to akurat pisałem Ok, thx. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Sanczo Napisano Sierpień 5, 2006 Zgłoszenie Share Napisano Sierpień 5, 2006 Najlepszy przyklad jaki znam to jakas aplikacja klient-server np. serwer wieloprocesowy HTTP. Jak cos to moge udostepnic na boku troche materialow uczelnianych pozdro Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
lszk Napisano Sierpień 5, 2006 Autor Zgłoszenie Share Napisano Sierpień 5, 2006 Znalazłem właśnie dzisiaj źródła takiego serwera → http://www.advancedlinuxprogramming.com/listings/ #chapter 11 Będe powoli analizować. Co do tych materiałów, to bardzo chętnie skorzystam Jakby co lszk(at)poczta(dot)fm Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się