Код:
#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 три символа (любые) в качетсве аргументов. Просто не могу разобраться до конца как передавать эти самые аргументы, и когда какой вызов применять... Не хватает примеров