2016-05-11 66 views
0

我正在嘗試通過兩個線程(主線程和第二個線程)之間的管道發送一些數據,但我得到關於文件描述符的errno 9。 我認爲文件描述符在涉及線程時被複制,但在這裏似乎不是這種情況。 它通常會返回「從bf嗨讀」,但它不會。 你能幫我解決這個問題嗎? 謝謝。 下面是代碼管道不通過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()(在線程中完成)失敗。

同一進程的線程可以通過直接與進行通信,因爲它們共享地址空間。例如,您可以使用全局變量進行線程之間的通信(具有適當的同步),或者您可以將一些內存和通過它傳遞給線程來發送數據。

您似乎期待的那種「共享」在進程之間使用,由共同祖先通過fork()創建。當分叉時,文件描述符(以及其他)將被複制,並且您可以在每個進程中結束並通過管道的另一端進行通信。看到這裏的簡單例子:Creating Pipes in C.

+0

謝謝我想我明白爲什麼它不工作 – kevin556