fork+exec (хм....)

Модератор: Модераторы разделов

Аватара пользователя
MUTOgen
Сообщения: 343
Статус: i like the way you move
ОС: OpenSuse 11.1

fork+exec

Сообщение MUTOgen »

Написал маленький примерчик для освоения работы с fork и exec. Есть 2 исполяемых файла. Первый это простая маленькая программка с название "mat" которая получает в качестве агументов элементы массива и высчитывает сумму этого массива. Вот она:

Код:

#include <iostream> #include <unistd.h> int main(int argc,const char *argv[]){ int i,sum=0,s; for(i=0;i<argc;i++){ s=atoi(argv[i]); sum=sum+s; } std::cout << "Summa= " << sum << std::endl; return 0; }

Далее есть программка "io". В ней создается программный канал, и осуществляется создание дочернего процесса при помощи fork, в котором и запускается на исполнение программка "mat". Вывод программки mat направлен на запись в канал, с другого конца канала процесс-отец читает это в строку buf. Т.е. по идее
там должно оказаться что-то вроде "Summa= X". Вот текст io:

Код:

#include <iostream> #include <fcntl.h> #include <unistd.h> #include <string.h> #define path "/home/download/sockets/mat" int main(){ int f,pipe_mas[2]; char line1[100],line2[2],line3[2]; char buf[20]; strcpy(line2,"1"); strcpy(line3,"1"); if(pipe(pipe_mas)){std::cerr << "Get_Pipe\n";return 1;} switch(fork()){ case -1: {std::cerr << "Get_Fork\n";return 1;} case 0: { close(pipe_mas[0]); dup2(pipe_mas[1],1); close(pipe_mas[1]); execlp(path,line2,line3,NULL); std::cerr << "Error_Exec\n"; return 1; } } close(pipe_mas[1]); dup2(pipe_mas[0],0); close(pipe_mas[0]); f=read(0,buf,10); if(f==-1){std::cerr << "Error_Read\n";return 1;} std::cout << buf << std::endl; return 0; }


Все компилится без ошибок и варнингов НО, вот результат работы:

Код:

./io Summa= 2 :�����_ݷ1


Не понятно откуда берутся эти самые символы на новой строке. В mat только один вывод в канал + io выводит только buf. Пробывал уменьшить размер buf специально ровно на количество символов необходимое для записи "Summa= 2", но эти самые кракозябры появляются и появляются снова...

Просьба разъяснить в чем дело... Есть подозрение на неправильный вызов execlp...

P.S. дополнительная просьба в качестве примера привести вызов exec, который бы передавал, скажем в программку в директории path три символа (любые) в качетсве аргументов. Просто не могу разобраться до конца как передавать эти самые аргументы, и когда какой вызов применять... Не хватает примеров :)
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: fork+exec

Сообщение nesk »

По моему Вы забыли про argv[0]
должно быть как то так
execlp(path,path,line2,line3,NULL);
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: fork+exec

Сообщение Rootlexx »

MUTOgen
В строке:

Код: Выделить всё

std::cout << buf << std::endl;

вы выводите на стандартный вывод содержимое buf как строку. Но строка должна заканчиваться символом «\0», у вас же это условие не выполнено.
Спасибо сказали:
Аватара пользователя
MUTOgen
Сообщения: 343
Статус: i like the way you move
ОС: OpenSuse 11.1

Re: fork+exec

Сообщение MUTOgen »

Rootlexx писал(а):
10.08.2008 15:19
Но строка должна заканчиваться символом «\0», у вас же это условие не выполнено.

действительно, забыл про /0 ...

А вообще еще хотел узнать насчет exec... когда применяется вызов v а когда l...? читал руководства, там написано просто когда требуется массив - v когда список - l... а примеров не было...
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: fork+exec

Сообщение nesk »

MUTOgen писал(а):
10.08.2008 14:41
P.S. дополнительная просьба в качестве примера привести вызов exec, который бы передавал, скажем в программку в директории path три символа (любые) в качетсве аргументов. Просто не могу разобраться до конца как передавать эти самые аргументы, и когда какой вызов применять... Не хватает примеров :)


советую почитать
http://www.citforum.ru/programming/c_unix/gl_6_5.shtml

от туда

Код: Выделить всё

char *argv[20];
    argv[0]="ls"; argv[1]="-l"; argv[2]="-i"; argv[3]=NULL;
    execv( "/bin/ls", argv);
            либо
    execl( "/bin/ls", "ls","-l","-i", NULL):



а вообще для задачи, которую вы реализовали, в реальной жизни используется функция popen
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
MUTOgen
Сообщения: 343
Статус: i like the way you move
ОС: OpenSuse 11.1

Re: fork+exec

Сообщение MUTOgen »

nesk писал(а):
10.08.2008 14:59
По моему Вы забыли про argv[0]
должно быть как то так
execlp(path,path,line2,line3,NULL);

да, спасибо :)
Спасибо сказали: