execlp 停止使用套接字发送数据
Posted
技术标签:
【中文标题】execlp 停止使用套接字发送数据【英文标题】:execlp stops using socket to send the data 【发布时间】:2012-01-13 17:01:24 【问题描述】:我正在创建一个程序来远程处理一些数据。 所以我使用类似的东西
猫文件 | ./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)
所以我可以获取数据并从父母发送给孩子。 客户端从标准输入读取并通过套接字发送,服务器通过套接字读取
问题出在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 上处理或使用 bash 进行 uuencode。 它有效,我认为它与套接字或时间有关,但我没有任何想法。 对不起,但我的英语不是那么好... XD。 谢谢你的一切
注意:
我使用了 strace,我注意到当我使用 base64 时,pid 停止,然后它尝试从 pid 读取(已经停止)。
有人知道我该如何解决吗?
【问题讨论】:
【参考方案1】:问题是
我发送数据并尝试在同一代码块上进行接收。 所以我现在使用 select 等到我有一些数据。
【讨论】:
以上是关于execlp 停止使用套接字发送数据的主要内容,如果未能解决你的问题,请参考以下文章