2012-01-13 26 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來等待,直到我有一些數據。