2016-05-11 11 views
0

私は現在、2つのスレッド(メインスレッドと2つ目のスレッド)間のパイプを通じてデータを送信しようとしていますが、ファイルディスクリプタについてはerrno 9を取得します。 スレッドが関わっているときにファイル記述子が重複していると思っていましたが、ここではそうではないようです。 通常、 "read from bf hi"が返されますが、そうではありません。 この問題の解決にお手伝いできますか?おかげさまで は、ここでは、コードパイプがpthread_tで動作していない

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <pthread.h> 

pthread_mutex_t mutex; 
int tube[2]; 

void * fonction(){ 
    if(close(tube[0])==-1){ 
     perror("close error \n"); 
     exit(EXIT_FAILURE); 
    } 
    printf("son \n"); 
    if(write(tube[1],"hi",2)<0){ 
     perror("write error \n"); 
     exit(EXIT_FAILURE); 
    } 
    printf("errno %d \n",errno); 
    pthread_exit(NULL); 
} 

int main(){ 
    pthread_t a; 
    if(pipe(tube)==-1){ 
     perror("pipe error \n"); 
     exit(EXIT_FAILURE); 
    } 
    char buffer[2]; 
    pthread_mutex_init(&mutex,NULL); 
    close(tube[1]); 
    pthread_create(&a,NULL,fonction,&tube[1]); 
    pthread_join(a,NULL); 
    read(tube[0],buffer,2); 
    printf("read from bf %s \n",buffer); 
    return EXIT_SUCCESS; 
} 

psです:timrauは(Pthread_t not startingが)私はpthread_joinをを使用しますが、私はそれが私がスレッドがあるときに、ファイル記述子が重複したと思って

+0

私はclose()を使用していると思いますが、私はそれについてはわかりません – kevin556

答えて

1

行うには正しい方法ではないと思い、ここで示唆したように関与していますが、ここではそうではないようです。

いいえ、それは当てはまりません。

プロセス内のすべてのスレッド共有(他のリソースの中でも)ファイル記述子。パイプの書き込み終了を閉じると、write()(スレッドで完了)が失敗します。

同じプロセスのスレッドは、で直接がアドレス空間を共有するので、それぞれ通信できます。たとえば、スレッド間の通信にグローバル変数(適切な同期を使用)を使用するか、またはmalloc()メモリとに渡してデータを送信することができます。

あなたが期待しているような「共有」の種類は、fork()で共通の祖先によって作成されたのプロセスの間で使用されています。 forkingの場合、ファイル記述子が重複し、各プロセスで一方が終了し、パイプの他方の端から通信できます。簡単な例はこちらをご覧ください:Creating Pipes in C.

+0

私はそれが動作していなかった理由を理解していると思います – kevin556

関連する問題