C中的并发程序(无法从方法中获得正确的输出答案)

时间:2015-01-30 19:34:50

标签: c concurrency pipe

我只给出了主要的方法代码。我在代码注释中解释了我的问题。

我的问题是,

我尝试在子进程中运行一个方法并且它可以工作......但它返回一个充满随机符号的乱码字符串。

有人可能会说我没有为方法返回分配内存,但我做到了。我还在inputReader方法中为返回变量分配了内存。

任何人都知道为什么会出现这个问题?

请忽略我只是从终端读取一个参数,我只是这样做因为我想在我向代码中添加更多行之前解决这个问题。

注意:使用的方法大约是150行...我将它作为一个不同的程序,当我自己运行它时,它输出正确并且有效。但是当我尝试在这个程序中使用它时,由于某种原因它没有返回我期望的答案。

代码:

int main(int argc, char *argv[])
{
      int     fd0[2], nbytes;
      pid_t   pid;
      ssize_t errorfi;

      char    readbuffer[9999],msg[9999];

      char** k = malloc(550);
      pipe(fd0);        

      pid = fork();

      if( pid < 0 ) {
        perror("bad fork");
        exit(0);
      }
      else if(pid == 0) {       //child process

        close(fd0[0]);

        // inputReader opens argv[1] (file) and finds all words
        // then finds all unique words
        // then returns char** p as a string containing:
        // filename, w1, w2, w3, uniquewords(int)
        // w1-w3 are the 3 most unique words with the highest freq 
        // found in the file
        k = inputReader(argv[1]); // PROBLEM HERE

        errorfi = write(fd0[1], k, 9999);  // write to pipe

         if (errorfi < 0 ) {

           fprintf (stderr, "errorfi = %d\n", errorfi);
           fprintf (stderr, "error writting texto1 in fd0 pipe %s\n",strerror(errorfi));
           exit(0);
         }

      exit(0);
     }
     else if(pid > 0) { //parent process

       close(fd0[1]);
       wait(NULL);
       nbytes = read(fd0[0], readbuffer, sizeof(readbuffer));
        printf("text received in parent from child trough pipe (%d) :%s\n", nbytes, readbuffer); 
       // returns pipe... readbuffer: returns " e�>� "
     }

return(0);

}

1 个答案:

答案 0 :(得分:0)

您的问题是变量k。它声明为char **,因此它是指向char的指针。它符合我对函数inputReader的理解。该函数(不是方法!函数,你在C中,没有方法)返回一个字符串数组(文件名等)。所以你在k所指向的内存中的是一个指向char的指针数组(如果你愿意,可以使用字符串,但请记住C中没有字符串)。然后,您将k(实际指针)写入管道,这是一种无意义的地址,不能在进程之间共享地址。所以你在父母那里得到的是指针的值(地址到内存中并不代表父母的东西)写成字符(如你所说的胡言乱语)。

所以你需要自己编写字符串。对于文件名,例如:

write(fd0[1],k[0],strlen(k[0])+1); // write the "string" pointed by k[0]

现在的问题是要正确阅读,因为在父母中你不知道阅读的长度......你必须解码你所读的内容,找到每个字符串的结尾并将其复制到某处的缓冲区