2010-12-05 91 views
0
/*Write a server application that does the following : 
open 5 named pipes in read­only mode & read from each in a separate thread created in your process – meaning, one thread per named pipe ; main threadoes not read from a named pipe, instead joins all the threads and  
terminates; each thread uses its own individual buffer for reading data from  
a specific named pipe 
*/ 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include<pthread.h> 
#include<fcntl.h> 
void* thread_routine1(void*fd1) 
{ 
char buff[512]; 
int bytes_read; 
while((bytes_read = read((int)fd1,buff,20)) >0) 
    { 
    printf("%s\n", buff); 
        write(stdout,buff,bytes_read); 
    //fflush(stdout); 
    } 
    if(bytes_read<0){perror("error"); } 
    close((int)fd1); 
} 
void* thread_routine2(void*fd2) 
{ 
char buff[512]; 
int bytes_read; 
while((bytes_read = read((int)fd2,buff,512)) >0) 
    { 
    //printf("%s\n", buff); 
        write(STDOUT_FILENO,buff,bytes_read); 
    //fflush(stdout); 
    } 
    if(bytes_read<0){ } 
    close((int)fd2); 
} 
void* thread_routine3(void*fd3) 
{ 
char buff[512]; 
int bytes_read; 
while((bytes_read = read((int)fd3,buff,512)) >0) 
    { 
    //printf("%s\n", buff); 
        write(STDOUT_FILENO,buff,bytes_read); 
    //fflush(stdout); 
    } 
    if(bytes_read<0){ } 
    close((int)fd3); 
} 
void* thread_routine4(void*fd4) 
{ 
char buff[512]; 
int bytes_read; 
while((bytes_read = read((int)fd4,buff,512)) >0) 
    { 
    //printf("%s\n", buff); 
        write(STDOUT_FILENO,buff,bytes_read); 
    //fflush(stdout); 
    } 
    if(bytes_read<0){ } 
    close((int)fd4); 
} 
void* thread_routine5(void*fd5) 
{ 
char buff[512]; 
int bytes_read; 
while((bytes_read = read((int)fd5,buff,512)) >0) 
    { 
    //printf("%s\n", buff); 
        write(STDOUT_FILENO,buff,bytes_read); 
    //fflush(stdout); 
    } 
    if(bytes_read<0){ } 
    close((int)fd5); 
} 
int main() 
{ 
    pthread_t thid[5]; 
int status,ret; 
int fd1,fd2,fd3,fd4,fd5; 
    int res = mkfifo("/tmp/my_fifo1", 0777); 
    if (res == 0) 
     printf("FIFO 1created\n"); 
    if(res<0) 
    perror("FIFO already created"); 
    res = mkfifo("/tmp/my_fifo2", 0777); 
    if (res == 0) 
     printf("FIFO created\n"); 
    if(res<0) 
    perror("FIFO 2already created"); 
     res = mkfifo("/tmp/my_fifo3", 0777); 
    if (res == 0) 
     printf("FIFO created\n"); 
    if(res<0) 
    perror("FIFO 3already created"); 
     res = mkfifo("/tmp/my_fifo4", 0777); 
    if (res == 0) 
     printf("FIFO created\n"); 
    if(res<0) 
    perror("FIFO 4already created"); 
     res = mkfifo("/tmp/my_fifo5", 0777); 
    if (res == 0) 
     printf("FIFO created\n"); 
    if(res<0) 
    perror("FIFO5 already created"); 
    fd1=open("/tmp/my_fifo1",O_RDONLY); 
    perror("open status is"); 
    sleep(5); 
    fd2=open("/tmp/my_fifo2",O_RDONLY); 
     perror("open status is"); 
    fd3=open("/tmp/my_fifo3",O_RDONLY); 
     perror("open status is"); 
    fd4=open("/tmp/my_fifo4",O_RDONLY); 
     perror("open status is"); 
    fd5=open("/tmp/my_fifo5",O_RDONLY); 
     perror("open status is"); 

     ret=pthread_create(&thid[0],NULL,thread_routine1,(void*)&fd1); 
     if(ret<0) 
     perror("error in thread create1"); 
    ret=pthread_create(&thid[4],NULL,thread_routine4,(void*)&fd5); 
     if(ret<0) 
     perror("error in thread create2"); 
     ret=pthread_create(&thid[1],NULL,thread_routine3,(void*)&fd2); 
     if(ret<0) 
     perror("error in thread create3"); 
     ret=pthread_create(&thid[2],NULL,thread_routine2,(void*)fd3); 
     if(ret<0) 
     perror("error in thread create4"); 
     ret=pthread_create(&thid[3],NULL,thread_routine5,(void*)fd4); 
     if(ret<0) 
     perror("error in thread create5"); 
    ret=pthread_join(thid[0],NULL); 
     ret=pthread_join(thid[1],NULL); 
     ret=pthread_join(thid[2],NULL); 
      ret=pthread_join(thid[3],NULL); 
       ret=pthread_join(thid[4],NULL); 
    ret=pthread_join(thid[5],NULL); 
    } 



    the above code for a process that creates a named pipe FIFO 
#include<fcntl.h> 
#include<sys/types.h> 
#include<sys/stat.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include<stdio.h> 
#include<strings.h> 


int main(int argc, char *argv[]) 
{ 

    char buf[512],wr_buf[512]; 
    int ret,ret1,status; 
    int npfd1,npfd2,npfd3,npfd4,npfd5; 
    struct stat s1,s2; 

    // ret = mkfifo(argv[1],0600); 


    npfd1 = open("/tmp/my_fifo1", O_WRONLY); //opening the named pipe for reading 
    npfd2= open("/tmp/my_fifo2", O_WRONLY); //opening the named pipe for reading 
    npfd3 = open("/tmp/my_fifo3", O_WRONLY); //opening the named pipe for reading 
     npfd4 = open("/tmp/my_fifo4", O_WRONLY); //opening the named pipe for reading 
     npfd5 = open("/tmp/my_fifo5", O_WRONLY); //opening the named pipe for reading 
            //only 
    if(npfd1<0) {perror("error in opening the named pipe"); exit(1); } 
printf("enter someting into the buffer\n"); 
bzero(buf,sizeof(buf)); 
gets(buf); 
    ret1 = write(npfd1,buf,20); 

    //printf("%s\n", buf); 
        write(STDOUT_FILENO,buf,ret1); 
    //fflush(stdout); 

    if(ret1<0){ printf("nothing is there\n");} 
    close(npfd1); 

    exit(0); 

} 

上面的代碼是我在創建FIFO的寫入結束。現在在不同的終端運行兩個程序後,我得到一個不良的文件描述符錯誤。當我嘗試寫東西給第一個namedpipe即。 my_fifo1。是否有可能通過我已經完成的方式將主要打開的filedescriptor傳遞給線程?壞的文件描述符被實現爲線程

+2

我編輯了帖子,以便它現在實際上可以讀取它。請花時間發佈一些東西,讓有人試圖回答它,並且使用正確的語法(即使英語不是您的第一語言,您應該意識到,連續放置超過10個問號不是您如何結束一個問題)。 – Yuliy 2010-12-05 19:25:22

回答

2

您的main()函數正在傳遞指向int的指針,但是您的線程函數正在將其轉換回int,然後嘗試將其用作文件描述符。這是行不通的 - 你需要在線程函數中取消引用傳入的指針(在這種情況下,這是可以的,因爲main()中的變量分配給每個線程,並且main()不會退出,直到所有線程都完成)。

void *thread_routine1(void *fd1) 
{ 
char buff[512]; 
int bytes_read; 
int fd = *(int *)fd1; 

while ((bytes_read = read(fd,buff,20)) > 0) 

/* ... */