2010-12-05 6 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); 

} 

Der obige Code ist, wo ich das Schreibende von FIFO erstelle. Jetzt, nachdem ich die beiden Programme in verschiedenen Terminals ausgeführt habe, erhalte ich einen BAD FILE DESCRIPTOR Fehler. wenn ich versuche, etwas in das erste namedpipe zu schreiben, ie. mein_fifo1. Ist es möglich, den Dateideskriptor, der in main geöffnet wurde, so zu übergeben, wie ich es getan habe?beschädigter Dateideskriptor realted zu Threads

+2

Ich habe den Beitrag so bearbeitet, dass es jetzt tatsächlich möglich ist, es jetzt zu lesen. Bitte nimm dir die Zeit, um Dinge zu posten, die jemand lesen könnte, und versuche korrekte Grammatik zu verwenden (auch wenn Englisch nicht deine Muttersprache ist), solltest du dir bewusst sein, dass mehr als 10 Fragezeichen nicht enden eine Frage). – Yuliy

+0

ok ich wiii mach's gut das nächste mal. –

Antwort

2

Ihre main() Funktion übergibt einen Zeiger an int, aber Ihre Thread-Funktionen werfen das zurück auf int und versuchen dann, es als Dateideskriptor zu verwenden. Das wird nicht funktionieren - Sie müssen den übergebenen Zeiger in den Thread-Funktionen dereferenzieren (das ist in diesem Fall OK, weil diese Variablen in main() pro Thread zugewiesen sind und main() erst beendet wird, wenn alle Threads beendet sind).

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

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

/* ... */ 
Verwandte Themen