2010-11-30 6 views
1

Der folgende Server erstellt eine Named Pipe, wenn es so laufen gelassen:Warum druckt diese benannte Pipe die gesendete Zeile nicht?

./serverprogram -p nameofthepipe -t 99 

die optarg nach t eine Anzahl von Threads anzeigt (hier noch nicht fertig) geschaffen werden. Wie dem auch sei

wird das Rohr nicht, hier zu arbeiten:

/* 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! 

Warum?

Server-Programm:

#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; 
} 

Client-Programm:

#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; 
} 
+0

Gibt 'read()' zurück? Was ist der Wert von 'numread'? – chrisaycock

+0

Es ist nicht. Ich bin besorgt über den Namen der Pipe. Ich denke, beide Enden der Sache bekommen den richtigen Namen nicht. – andandandand

+0

Testen Sie die Rückgabewerte von 'open()' und 'read()'. – caf

Antwort

2

im Client hält fgets das Newline am Ende der Leitung, so müssen Sie abzustreifen, dass vor dem Öffnen Datei.

Auch in dem Code wie angegeben, Sie öffnen wrfd aber schreiben zu pipeIntId, die nicht initialisiert ist (obwohl Sie vielleicht etwas aus einer Funktion hier extrahieren).

+0

Ja, ich habe das auch gefangen. Danke, dass Sie sich die Zeit genommen haben, sich den Code anzusehen. – andandandand