Я создаю программу для обработки некоторых данных удаленно.Поэтому я использую что-то вроде
cat file |./client -i "machineip" -p "порт" -c "команда"
Я могу использовать команду как "base64 -d | tar -zvt", если я хочу получить список внутри моего tar-файла,У меня есть эти объекты;
Sock .. это объект, который реализует сокет C.RCVBUFSIZE = 2000 и размер, который я использую для отправки и получения pid данных, чтобы узнать, являюсь ли я дочерним или родительским процессом
. Для этого я использую трубу и вилку.базовая структура:
int fd[2];
pipe(fd);
if((pid=fork()) == -1) exit(-1);
if(pid == 0)
{
while((recvMsgSize = sock->recv(echoBuffer, RCVBUFSIZE)){
write(fd[1], echoBuffer, recvMsgSize);
}
}
else pipeback(fd,sock)
Так что я могу получить данные и отправить от родителя к ребенку.Клиент читает из stdin и отправляет через сокет, а сервер читает через сокет
Проблема в pipeBack
void pipeback(int *fdRef, TCPSocket *sock){
char *buffer = new char[2000];
int size;
close(fdRef[1]);
dup2(fdRef[0], 0);
close(fdrEf[0]);
pipe(fout)
if((pid = fork()) == -1)exit(-1);
if(pid ==0){
close(fout[0]);
dup2(fout[1], 1);
close(fout[1]);
execlp("bash", "bash", "-c", "base64", NULL);
}
else{
close(fout[1]);
while((size = read(fout[0], buffer, 2000)) > 0){
sock->send(buffer, size);
write(fileno(stdout), buffer, size);
}
}
}
Проблема в строке "execlp (" bash ", "bash", "-c", "base64", NULL); "если я использую cat для четвертого аргумента, это работает, если я использую один ls -lahtr, он показывает мне файлы в папке, поэтому работает как шарм.НО, когда я использую base64 или uuencode ... возможно, другие команды останавливается на строке чтения и останавливается, умирает, я использовал strace и gdb, чтобы увидеть, что происходит.Я не знаю, что мне нужно сделать, чтобы отладить этот процесс.Поэтому я создал отдельную программу, только для чтения со стандартного ввода и использования канала для обработки на base64 или uuencode с помощью bash.Это работает, я думаю, это что-то с сокетом или временем, но у меня нет никаких идей.Извините, но мой английский не такой хороший ... XD.Спасибо за все
ПРИМЕЧАНИЕ:
Я использовал strace и заметил, что когда я использую base64, pid останавливается, а затем пытается прочитать из pid (уже остановлен).
Кто-то знает, как я могу это решить?