Skocz do zawartości

[c++] Fork


lszk

Rekomendowane odpowiedzi

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

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

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ę
×
×
  • Dodaj nową pozycję...