使用管道

时间:2011-10-30 07:29:35

标签: c linux named-pipes

我正在努力使这项工作但没有运气,基本上我需要写入管道,然后使管道返回我发送的文本。我有一个server.c和client.c,所以我让server.c运行...,打开一个新的终端,然后运行客户端..问题是,当我运行它时客户端什么都不做..我我确定我错过了一些东西......比如关闭管道。我不确定..我真的很感激一些指导

server.c

#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#define PIPE1      "PIPE1"
#define PIPE5      "PIPE5"

#define MAX_BUF_SIZE    255

int main(int argc, char *argv[])
{
    int rdfd1,rdfd2,rdfd3,rdfd4, wrfd1,wrfd2,wrfd3,wrfd4,ret_val, count, numread1,numread2,numread3,numread4;
    char buf1[MAX_BUF_SIZE];
    char buf2[MAX_BUF_SIZE];
    char buf3[MAX_BUF_SIZE];
    char buf4[MAX_BUF_SIZE];

    /* Create the first named - pipe */
    ret_val = mkfifo(PIPE1, 0666);


    if ((ret_val == -1) && (errno != EEXIST)) {
        perror("Error creating the named pipe");
          return 1; 
    }



    ret_val = mkfifo(PIPE5, 0666);

    if ((ret_val == -1) && (errno != EEXIST)) {
        perror("Error creating the named pipe");
        return 1; 
    }

    /* Open the first named pipe for reading */
    rdfd1 = open(PIPE1, O_RDONLY);


    /* Open the first named pipe for writing */
    wrfd1 = open(PIPE5, O_WRONLY);


    /* Read from the pipes */
    numread1 = read(rdfd1, buf1, MAX_BUF_SIZE);


    buf1[numread1] = '0';

    printf("Server : Read From the  pipe : %sn", buf1);


    /* 
     * Write the converted content to 
     * pipe 
     */    
   write(wrfd1, buf1, strlen(buf1));

}

client.c

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PIPE1      "PIPE1"
#define PIPE5      "PIPE5"


#define MAX_BUF_SIZE    255


int main(int argc,  char *argv[ ]) {
   pid_t childpid;             
   int error;                  
   int i;                     
   int nprocs;                
           /* check command line for a valid number of processes to generate */

   int wrfd1, rdfd1, numread;
    char rdbuf[MAX_BUF_SIZE];

   if ( (argc != 2) || ((nprocs = atoi (argv[1])) <= 0) ) {
       fprintf (stderr, "Usage: %s nprocs\n", argv[0]);
       return 1; 
   }  



   for (i = 1; i < nprocs;  i++) {  
       /* create the remaining processes */

            if ((childpid = fork()) == -1) {
                  fprintf(stderr, "[%ld]:failed to create child %d: %s\n", (long)getpid(), i, strerror(errno));
                   return 1; 
                } 

          /* Open the first named pipe for writing */
          wrfd1 = open(PIPE5, O_WRONLY);

          /* Open the second named pipe for reading */
         rdfd1 = open(PIPE1, O_RDONLY);


         if (childpid)
         break;

           char string1[100];

            if(sprintf(string1, "This is process %d with ID %ld and parent id %ld\n", i,  (long)getpid(), (long)getppid())) {
              write(wrfd1,string1, strlen(string1));
              }

         /* Read from the pipe */
         numread = read(rdfd1, rdbuf, MAX_BUF_SIZE);

         rdbuf[numread] = '0';

         printf("Full Duplex Client : Read From the Pipe : %sn", rdbuf);    
      } 


   return 0; 
}  

2 个答案:

答案 0 :(得分:2)

似乎服务器和客户端都从PIPE1读取并写入PIPE5。难道其中一个不能写入PIPE1,以便另一个可以从另一端读取它吗?

此外,如果您使用./client 1进行测试,则for (i = 1; i < nprocs; i++)循环将永远不会执行。

最后一件事,请看question。我不完全确定它适用于您的代码,但值得记住。

答案 1 :(得分:1)

这一行不应该是'\0'吗?

buf1[numread1] = '0';