Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的并发程序(无法从方法中获得正确的输出答案)_C_Concurrency_Pipe - Fatal编程技术网

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

C中的并发程序(无法从方法中获得正确的输出答案),c,concurrency,pipe,C,Concurrency,Pipe,我只给出了主方法代码。我在代码注释中解释了我的问题 我的问题是, 我试着在子进程中运行一个方法,它是有效的。。。但它返回一个充满随机符号的乱七八糟的字符串 有人可能会说我没有为return方法分配内存,但我分配了。我还为inputReader方法中的返回变量分配了内存 有人知道为什么会发生这个问题吗 请忽略我只是从终端读取一个参数,我这么做是因为我想在向代码添加更多行之前解决这个问题 注:使用的方法约为150行。。。我把它作为一个不同的程序,当我自己运行它时,它会正确地输出每一个数据,并且工作正

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

我的问题是,

我试着在子进程中运行一个方法,它是有效的。。。但它返回一个充满随机符号的乱七八糟的字符串

有人可能会说我没有为return方法分配内存,但我分配了。我还为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);

}

你的问题是变量k。它被声明为具有char**,因此它是指向char的指针。它符合我对inputReader函数的理解。那个函数不是方法!函数在C中,没有方法返回字符串数组文件名等。因此,如果您愿意,在内存中由k指向的是一个指向字符字符串的指针数组,但请记住C中没有字符串。然后,您将k指针实际写入管道,这是一种无意义的方法,进程之间无法共享地址。因此,在父级中得到的是指向内存的指针地址的值,它不代表父级中的某些内容,正如您所说的,这些内容被写成了chars-gibberish

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

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

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

如果我从k复制所有内容,并将其连接到一个带有空格的字符串中,使其成为一个字符数组,然后将其发送到管道中,你可以随意使用任何你想要的内容。您需要的是序列化。请看,您可以使用任何您想要的序列化格式,选择一种使事情更简单的格式。