我正在创建一个程序来处理一些远程数据。 所以我使用像
这样的东西cat file | ./client -i“machineip”-p“port”-c“command”
如果我想获取tar文件中的列表,我可以使用命令“base64 -d | tar -zvt”。 我有那些对象;
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);”如果我使用第四个参数上的猫它是有效的,如果我使用一个ls -lahtr是显示文件夹上的文件,所以,就像一个魅力。 但是,当我使用base64或uuencode ...可能其他命令它停在读取线上,停止,死亡,我使用strace和gdb看看发生了什么。 我不知道我需要做什么来调试这个过程。 所以我创建了一个单独的程序,只是从stdin读取并使用管道在base64或uuencode上使用bash进行处理。 它工作,我认为这是插座或时间的东西,但我没有任何想法。 对不起,但我的英语不是那么糟糕...... XD。 谢谢你的一切
注:
我使用strace,我注意到当我使用base64时pid停止然后它尝试从pid中读取(已经停止)。
有人知道如何解决这个问题吗?
答案 0 :(得分:0)
问题是
我发送数据并尝试回收相同的代码块。 所以我现在使用select等到我有一些数据。