LINUX.ORG.RU

Почему не срабатывает exec?


0

0

Привет! Есть проблема не работает exec при вызове a2ps. Строка генерируется верно,непосредственно в консоли она работает. В чем дело?
И еще, может кто-то даст лучший совет? Использую, естественно, stl, а не самопальные поделки (я про string)
//печать 
int CProtocol::Print(){
int rc = 0; //return code - в зависимости от того, как отработал exec
	list<string>::iterator s = strlist.begin();
	while( s != strlist.end() ){
		ProtocolFile<<*s<<endl;
		s++;
	}
//тут будет сама печать - вызов a2ps
string Program = "a2ps ";
string PrinterTask[4];//массив строк задания для печати -  заголовок, титул, кодировка, файл
       
       //Заголовок
       if( HeaderText != "" ){
		PrinterTask[0] = "--header=\""+HeaderText+"\" ";		
       } else {
    		PrinterTask[0] = "";
       }//if-else
        
       //Титул
       if( TitleType != ""){
	       PrinterTask[1] = TitleType+"=\""+TitleText+"\" ";
       } else {
    	       PrinterTask[1] = "";	
       }
       		
       //Кодировка		
       PrinterTask[2] = "--encoding="+Encoding+" ";		

       //Сам файл
       PrinterTask[3] = ProtocolFileName;	
       
       cout<<"имеем для печати:  "<<endl;
       for(int i = 0; i<4; i++){ 
    		cout<<PrinterTask[i];
       }
       cout<<endl;
       
//Для работы с дочерним процессом
pid_t child_pid;
	child_pid = fork();
	if( child_pid == -1 ){
		rc = -1;
	} else {
		if(child_pid == 0){
			cout<<"Должна пойти печать"<<endl;
			//Запускаем печать
			rc = execlp(
				    "a2ps ",
				    PrinterTask[0].c_str(),
				    PrinterTask[1].c_str(),
				    PrinterTask[2].c_str(),
				    PrinterTask[3].c_str(),
				    NULL
				   );
		}else{
			//вернулись в родительский
			sleep(1);
		}    
		rc = 0;
	}
return rc;
};

То, что Вы не читаете документацию, не проверяете коды завершения, и не пользуетесь дебагером - абсолютно правильно ! Иначе как бы мы увидили 'несамопальный' stl ? :)

шутки в сторону : "a2ps " - тут есть лишний пробел, и такого файла физически нет в системе.

в вызове execlp - второй аргумент (argv0) - имя вызываемой программы, то есть execlp("a2ps","a2ps","--help",NULL);

string PrinterTask[4]; не самое элегантное решение, если уж stl - то иметь его по полной с дин. массивами

и не забывайте завершать дочернний процесс - exec бывает и обламывается и есть шанс получить головную боль от копии задачи.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

"То, что Вы не читаете документацию, не проверяете коды завершения, и не пользуетесь дебагером - абсолютно правильно !" Нет, это не правильно, но тем не мение спасибо за критику.

popov_da
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.