0
/*Write a server application that does the following :
open 5 named pipes in readonly 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傳遞給線程?壞的文件描述符被實現爲線程
我編輯了帖子,以便它現在實際上可以讀取它。請花時間發佈一些東西,讓有人試圖回答它,並且使用正確的語法(即使英語不是您的第一語言,您應該意識到,連續放置超過10個問號不是您如何結束一個問題)。 – Yuliy 2010-12-05 19:25:22