我正在創建一個程序來處理一些數據遠程。 所以我使用類似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讀取(已停止)。
有人知道我可以解決這個問題嗎?