2014-10-31 41 views
0

我已經寫了重定向代碼使用管道,也寫了使用popen之後。 我發現奇怪的輸出順序。如何提示顯示早於popen調用的stdout?

#include <stdio.h> 
int main(){ 
     FILE* fp; 
     fp=popen("mkpasswd -msha-512 -Sqwertyabc asdf","r"); 
     char buf[120]; 
     fscanf(fp,"%s",buf); 
     printf("result : %s\n",buf); 

     fp=popen("mkpasswd -msha-512 -Sqwertyabc","w"); 
     fprintf(fp,"asdf"); 
     //fflush(fp); 
     return 0; 
} 
~/workspace/tmp$ ./a.out 
result : $6$qwertyabc$zctY7qCE/1e0b4iw0E.saKy6/QvVap4Ejdh16iTDc2dTM2n0tjtam/XikbYX02i/nnAjJopuIa2hQ.//wcZt80 
~/workspace/tmp$ Password: $6$qwertyabc$.32ixI96wLr3h2nfYR9opTW3KFVuHWDFyI36JID.DI1riXs0glb/pzmNvdNEaoLDdEV3UkqxspBUruOzLMVMN/ 

不管我commentize或不是 'fflush',我的提示顯示出來早於後者mkpasswd「呼叫的輸出。

這怎麼可能是這樣的?我應該知道些什麼?

回答

1

由於忘記關閉popen生成的FILE,出現在上次打印輸出之前的提示。只需在return 0;之前加上fclose(fp);即可。

但我認爲你必須在你的代碼2個其他問題:

  • 不先命令後打開導致內存泄漏的第二個之前關閉fp:由FILE對象所使用的內存不再訪問
  • 你的mkpasswd標準輸入(在第二個命令)寫asdf,但這種語法mkpasswd使用getpass/dev/tty直接讀取。您應該使用-s標誌標準輸入

讀取正確的代碼應該是:

#include <stdio.h> 
int main(){ 
     FILE* fp; 
     fp=popen("mkpasswd -msha-512 -Sqwertyabc asdf","r"); 
     char buf[120]; 
     fscanf(fp,"%s",buf); 
     fclose(fp); 
     printf("result : %s\n",buf); 

     fp=popen("mkpasswd -s -msha-512 -Sqwertyabc","w"); 
     fprintf(fp,"asdf"); 
     fclose(fp); 
     return 0; 
} 

它給

result : $6$qwertyabc$zctY7qCE/1e0b4iw0E.saKy6/QvVap4Ejdh16iTDc2dTM2n0tjtam/XikbYX02i/nnAjJopuIa2hQ.//wcZt80 
$6$qwertyabc$zctY7qCE/1e0b4iw0E.saKy6/QvVap4Ejdh16iTDc2dTM2n0tjtam/XikbYX02i/nnAjJopuIa2hQ.//wcZt80 

正確緊接着提示。

+0

恐怕這不正確。 我試過了,但事實證明是一樣的。另外,我的觀點是關於二線和三線,而不是一線和二線。 另外,你說的是stderr比stdout更快顯示(stderr沒有緩存,但標準輸出是),但它是關於延遲顯示stderr甚至晚於進程結束(即時顯示後的意思)。 – user3293793 2014-11-01 02:39:18

+0

Oups,我應該完全讀你的問題,並測試我的答案:-( - 現在是正確的... – 2014-11-01 09:43:13

+0

哦,我現在看到。謝謝你的回答和評論有關的問題。 – user3293793 2014-11-03 00:40:26