2012-01-13 51 views
0

我正在创建一个程序来处理一些数据远程。 所以我使用类似execlp停止使用套接字发送数据

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) 

这样我就可以获取数据,并从父母送孩子。从标准输入读取 客户端,并通过套接字发送和服务器通过套接字

的问题是在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(”庆典“”庆典“,”-c“,”base64“,NULL);”如果我使用猫的第四个参数它的工作原理,如果我使用一个ls -lahtr显示我的文件夹上的文件,所以,就像一个魅力。 但是,当我使用base64或uuencode ...可能其他命令停止在读取行,并停止,死亡,我用strace和gdb看看发生了什么。 我不知道我需要做什么来调试这个过程。 所以我创建了一个单独的程序,只能从stdin读取并使用管道在base64或uuencode上使用bash进行处理。 它的工作,我的事情是与插座或时间,但我没有任何想法。 对不起,但我的英语不是那个笨蛋...... XD。 感谢一切

注:

我用strace的,我注意到当我使用的base64,PID停止,然后它会尝试从PID读取(已停止)。

有人知道我可以解决这个问题吗?

回答

0

问题是

我发送数据并尝试recv在同一代码块上。 所以我现在使用select来等待,直到我有一些数据。