2010-12-05 16 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の書き込み終了部分を作成しています。今、別の端末で2つのプログラムを実行した後、私はバッドファイル記述子エラーを取得しています。私は最初のnamedpipeに何かを書き込もうとします。 my_fifo1。メインで開かれているファイル記述子をスレッドに渡すことは可能ですか?スレッドにレンダリングされたファイル記述子が不良です

+2

私はこの記事を実際に読むことができるように編集しました。実際に読む人が実際に読むことができるものを投稿し、正しい文法を使用するような時間をとってください(たとえ英語が母国語でない場合でも、10個以上の疑問符を連続して置くことはあなたのやり方ではありません質問)。 – Yuliy

+0

ok i wiiは次回に気をつけます。 –

答えて

2

main()関数はポインタをintに渡していますが、スレッド関数はintにキャストしてからファイル記述子として使用しようとしています。これはうまくいきません - スレッド関数で渡されたポインタを間接参照する必要があります(この場合はOKです)。main()の変数はスレッドごとに1つ割り当てられ、main()はすべてのスレッドが終了するまで終了しません)。

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

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

/* ... */ 
関連する問題