Почему эта именованная труба не печатает отправленную строку? - PullRequest
1 голос
/ 30 ноября 2010

Следующий сервер создает именованный канал при его запуске следующим образом:

./serverprogram -p nameofthepipe -t 99

optarg после t указывает количество создаваемых потоков (здесь не сделано).

В любом случае, труба здесь не работает:

/* 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 Ответ

2 голосов
/ 30 ноября 2010

В клиенте fgets сохраняет символ новой строки в конце строки, поэтому вам необходимо удалить его перед открытием файла.

Кроме того, в указанном коде выоткрытие wrfd, но запись в pipeIntId, которая не инициализирована (хотя, возможно, вы извлекаете что-то из функции здесь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...