execlp停止使用socket发送数据

时间:2012-01-13 17:01:24

标签: c++ bash sockets pipe

我正在创建一个程序来处理一些远程数据。 所以我使用像

这样的东西

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中读取(已经停止)。

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

问题是

我发送数据并尝试回收相同的代码块。 所以我现在使用select等到我有一些数据。

相关问题