为什么这个命名管道不打印发送的线路?

时间:2010-11-30 03:43:11

标签: c unix named-pipes

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

./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;
}

1 个答案:

答案 0 :(得分:2)

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

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