2017-02-24 3 views
1

を使用してCでのopensslのstdioのへの書き込み私はこのようにOpenSSLにいくつかのデータを渡すためにしようとしています:はパイプ

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がバフからデータを取得しないように、それはいくつかの入力のために私を待ってハングアップするようです思う。 私は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

バフに改行が含まれていますか? – Ctx

+0

@ orion78fr親プロセスでstdoutにfd [1]を複製しようとしましたが、printfとfflushを使ってパイプに書き込むと、再び動作しません。 – vacso

答えて

0

dup2()の引数を切り替えました。

プロトタイプは次のとおりです。

int dup2(int oldfd, int newfd); 

ので、あなたは子プロセスの標準入力としてfd[0]を設定する

dup2(fd[0], 0); 

を行う必要があります。それは期待どおりに動作するはずです。

+0

私はこれに気づかなかったために盲目であったにちがいない... – Ctx