2015-09-18 60 views
-1

我想fork一個孩子和管道連接到標準輸入和孩子的標準輸出。然後運行exec ./xx。之後,我從父母給孩子送17,孩子打印它。迄今爲止都很好。但是當我向父母發送回覆時,它不起作用。 結果是:輸出什麼,看起來像等待一些輸入。 如果我刪除代碼「fscanf(b,」%d「,& x);」在父母,輸出是: 從C 0從p 17 我很困惑,爲什麼我得到奇怪的結果?謝謝Linux下C從孩子將數據發送到家長是好的,但不能從孩子將數據發送到父

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdbool.h> 

int main(int argc, char** argv) { 
    int fds[2], cp[2], x = 0; 
    pipe(fds); 
    pipe(cp); 
    int pid=fork(); 

// c 
if (pid==0) {    
    close(fds[1]); 
    close(cp[0]); 
    dup2(fds[0],0); 
    dup2(cp[1], 1); 
    close(cp[1]); 
    close(fds[0]);  
    execlp("./xx", "xx", 0);    
} 
// p 
if (pid) {  

    close(fds[0]); 
    close(cp[1]); 
    dup2(fds[1],1); 
    close(fds[1]); 
    FILE* a=fdopen(1, "w"); 
    FILE* b=fdopen(cp[0], "r"); 
    fprintf(a, "17");  
    fscanf(b, "%d", &x); 
    fprintf(stderr, "from C %d", x); 
    } 

    return 0; 
} 

XX

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdbool.h> 
int main() { 
    int y = 0; 
    FILE* r=fdopen(STDIN_FILENO, "r"); 
    fscanf(r, "%d", &y); 
    fprintf(stderr, "from p %d \n ", y); 
    FILE* w=fdopen(STDOUT_FILENO, "w"); 
    fprintf(w, "17"); 
    return 0; 
} 
+0

你試圖用寫函數,而不是fprintf中? '寫(STDOUT_FILENO, 「17」,2)' – krystian71115

+0

你爲什麼CP [1]'DUP2後'關'(CP [1],1)' – krystian71115

+0

我的老師告訴我們一個管道只有寫,另一個入口爲了閱讀,我們必須關閉它。 –

回答

0

使用此代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdbool.h> 

int main(int argc, char** argv) { 
    int fds[2], cp[2], x = 0; 
    pipe(fds); 
    pipe(cp); 
    int pid = fork(); 

if (pid==0) {    
    close(fds[1]); 
    close(cp[0]); 
    dup2(fds[0], 0); 
    dup2(cp[1], 1);  
    execlp("./xx", "xx", NULL);  
} 
if (pid > 0) {  

    close(fds[0]); 
    close(cp[1]); 
    FILE * a = fdopen(fds[1], "w"); 
    FILE * b = fdopen(cp[0], "r"); 
    fprintf(a, "17\n"); 
    fflush(a); 
    fscanf(b, "%d", &x); 
    fprintf(stderr, "from C %d\n", x); 
} else { 
    // error while fork 
    perror("fork"); // print error to console. 
    return 1; 
} 

    return 0; 
} 

及××:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdbool.h> 
int main() { 
    int y = 0; 
    FILE* r = stdin; 
    fscanf(r, "%d", &y); 
    fprintf(stderr, "from p %d \n ", y); 
    FILE* w = stdout; 
    fprintf(w, "17\n"); 
    fflush(w); 
    return 0; 
} 

它的工作對我來說:)

1

我想我想通了。你需要刷新你的輸出緩衝區。對於stderr,fprintf僅默認執行此操作。所以在parent.c文件:

fprintf(a, "17"); 
fflush(a); 

而且在孩子:

fprintf(w, "17"); 
fflush(w); 

我早就預料到了自己的工作,但我不是一個C專家,它沒「T。但是,將父代中的兩條線更改爲

fprintf(a, "17\n"); 
fflush(a); 

使它適用於我。

+0

謝謝你的幫助,我試試你的想法,但得到相同的結果。 –

+0

什麼版本(發行版)的Linux您使用的是? –

+0

我不知道由學校提供服務的系統,我只是用苔蘚來遙控它 –

相關問題