2017-02-24 16 views
1

我想一些數據傳遞到OpenSSL的這樣寫OpenSSL的標準輸入輸出在C:使用管

int fd[2]; 
char buff[MAXBUFF]; 
pid_t childpid; 
pipe(fd); 

childpid = fork(); 

if (childpid == 0){ 
    dup2(0, fd[0]); 
    close(fd[1]); 
    execlp("openssl", "s_client", "-connect", "imap.gmail.com:993", "-crlf", NULL); 
} 
else { 
    close(fd[0]); 
    dosomething(buff); 
    write(fd[1], buff, strlen(buff) + 1); 
    sleep(4); 
} 

但好像OpenSSL的不得到BUFF的數據,它只是掛起等待一些輸入我認爲。 如果我做同樣的事情在bash

a.sh:

. 
. 
. 
echo $data 
sleep 3 
. 
. 
. 

b.sh:

openssl s_client -connect imap.gmail.com:993 -crlf 

./a.sh | ./b.sh

一切工作正常。

+0

你可以嘗試沖洗管道? – orion78fr

+0

確實buff是否包含尾隨換行符? – Ctx

+0

@ orion78fr嗯,我試圖將fd [1]複製到父進程中的stdout,然後使用printf和fflush寫入管道,並且它不再工作。 – vacso

回答

0

您切換了dup2()的參數。

的原型爲:

int dup2(int oldfd, int newfd); 

所以你應該做

dup2(fd[0], 0); 

設置fd[0]作爲子進程的標準輸入。然後它應該按預期工作。

+0

我之前一直沒有注意到這一點,因此一定是盲目的... – Ctx