为啥这个命名管道不打印发送的行?

Posted

技术标签:

【中文标题】为啥这个命名管道不打印发送的行?【英文标题】:Why is this named pipe not printing the sent line?为什么这个命名管道不打印发送的行? 【发布时间】:2010-11-30 03:43:10 【问题描述】:

以下服务器在运行时会创建一个命名管道:

./serverprogram -p nameofthepipe -t 99

t 后面的 optarg 表示要创建的线程数(这里不做)。

无论如何,管道在这里不起作用:

/* Open the first named pipe for reading */
    int rdfd = open(pipeName, O_RDONLY);

 /* Read from the first pipe */
int numread = read(rdfd, command_and_pid, 280);


printf("what's being read is %s \n", command_and_pid);  // not printing!!1! 

为什么?

服务器程序:

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>



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


char pipeName[30];
int  numThreads; 

char command_and_pid[280];


  int opcion;
        if (argc < 2) 
        printf ("ERROR: Missing arguments\n");//
        exit(1);
   
  opterr = 0;




while ((opcion = getopt (argc, argv, "p:t:w")) != -1)

        switch (opcion) 

               case 'p': // -p indica el nombre del pipe
               printf("The name of the pipe is: %s\n",optarg);
               strcpy(pipeName, optarg);

               break;

               case 't'://-t indica los hilos 
        printf("The number of threads is: %s\n",optarg);
               numThreads= atoi(optarg);

               break;

               case '?':
        fprintf(stderr,"no reconozco esa opcion\n");
               break;
        






    int ret_val = mkfifo(pipeName, 0666);

    if ((ret_val == -1) && (errno != EEXIST)) 
        perror("Error creating the named pipe");
        exit (0);
    


     /* Open the first named pipe for reading */
    int rdfd = open(pipeName, O_RDONLY);

     /* Read from the first pipe */
    int numread = read(rdfd, command_and_pid, 280);


    printf("what's being read is %s \n", command_and_pid);  // not printing!!1! 


    close(rdfd);


   return 0;

客户端程序:

#include <unistd.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>  
#include <pthread.h>





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




        char pipeName[30]; 

        printf("write the name of the pipe used to write to the server \n");

        fgets(pipeName,30, stdin);

         /* Open the first named pipe for writing */
        int wrfd = open(pipeName, O_WRONLY);


         printf("write the name of the command you want to execute \n");  

         char command_and_pid[280];
         char command[250];


          fgets(command,250, stdin);
          puts(command); //quitar

         strcpy(command_and_pid,command);
         strcat(command_and_pid," ");


         int pipeIntId; 

         char pidstring [30];

         int pid= getpid(); 

         sprintf(pidstring,"%d", pid);

         strcat(command_and_pid,pidstring); 

         int written;

         written=write(pipeIntId,command_and_pid,280); 
         //write to the pipe          
         // send the command and pid 


         close(pipeIntId); // close write pipe      


 return 0;

【问题讨论】:

read() 是否返回? numread 的值是多少? 不是。我担心管道名称。我认为事情的两端都没有正确命名。 测试open()read()的返回值。 是的,这是一个管道名称。我猜客户端 fgets 上的空格搞砸了。 【参考方案1】:

在客户端中,fgets 将换行符保留在行尾,因此您需要在打开文件之前删除它。

此外,在给定的代码中,您正在打开 wrfd,但写入未初始化的 pipeIntId(尽管您可能正在从此处的函数中提取某些内容)。

【讨论】:

是的,我也发现了。感谢您花时间查看代码。

以上是关于为啥这个命名管道不打印发送的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何写入命名管道而不等待读取管道

为啥命名管道是本地的?

为啥在没有人阅读后继续写入命名管道?

为啥只读打开命名管道块?

为啥 os.path.exists() 会阻止 Windows 命名管道连接?

为啥线程在进程间通信期间会破坏命名管道?