c - 与线程相关的错误文件描述符

标签 c linux

/*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 写端的地方。现在,在不同的终端中运行这两个程序后,我收到了 BAD FILE DESCRIPTOR 错误。当我尝试向第一个命名管道写一些东西时,即。我的_fifo1。是否可以按照我所做的方式将在 main 中打开的文件描述符传递给线程?

最佳答案

您的 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)

 /* ... */

关于c - 与线程相关的错误文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4360653/

相关文章:

c++ - UDP并发客户端recvfrom错误

c 程序无法正确接受输入并产生错误的输出

linux - 如何正确编写 Gentoo 的 ebuild

linux - 如何使用多个 if then

android - NDK PIE 二进制文件在运行时显示链接器警告

c - 从文件加载到链表

C rename() FileNotFound 尽管文件存在

小型团队的 Linux 开发环境

linux - 从 Unix 系统中删除文件

linux - Makefile:make 期间出错