C 中的并发程序(无法从方法中获得正确的输出答案)
Concurrent Program in C ( can't get a proper output answer from method)
我只给出了主要方法代码。我在代码注释中解释了我的问题。
我的问题是,
我尝试 运行 子进程中的一个方法并且它有效...但是它 return 是一个充满随机符号的乱码字符串。
有人可能会说我没有为方法分配内存 return 但我确实分配了。我还在 inputReader 方法中为 return 变量分配了内存。
有人知道为什么会出现这个问题吗?
请忽略我只是从终端读取一个参数,我这样做是因为我想在向代码添加更多行之前解决这个问题。
注意:使用的方法大约有 150 行...我将它作为一个不同的程序使用,当我 运行 它本身时,它会正确输出每一个并且可以工作。但是,当我尝试在此程序中使用它时,出于某种原因,它并没有 return 我期望的答案。
代码:
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 中的函数,没有方法)returns 一个字符串数组(文件名等)。因此,k
指向的内存中的内容是指向 char
的指针数组(如果您愿意,可以使用字符串,但请记住 C 中没有字符串)。然后,您将 k
(实际上是指针)写入管道,这是无意义的,因为地址不能在进程之间共享。因此,您在父级中获得的是指针的值(不代表父级中某些内容的内存地址)写为字符(如您所说的胡言乱语)。
所以你需要自己写字符串。例如文件名:
write(fd0[1],k[0],strlen(k[0])+1); // write the "string" pointed by k[0]
现在的问题是正确读取它,因为在父级中你不知道要读取的长度......你必须解码你所读取的内容,找到每个字符串的末尾并将它复制到某处的缓冲区.
我只给出了主要方法代码。我在代码注释中解释了我的问题。
我的问题是,
我尝试 运行 子进程中的一个方法并且它有效...但是它 return 是一个充满随机符号的乱码字符串。
有人可能会说我没有为方法分配内存 return 但我确实分配了。我还在 inputReader 方法中为 return 变量分配了内存。
有人知道为什么会出现这个问题吗?
请忽略我只是从终端读取一个参数,我这样做是因为我想在向代码添加更多行之前解决这个问题。
注意:使用的方法大约有 150 行...我将它作为一个不同的程序使用,当我 运行 它本身时,它会正确输出每一个并且可以工作。但是,当我尝试在此程序中使用它时,出于某种原因,它并没有 return 我期望的答案。
代码:
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 中的函数,没有方法)returns 一个字符串数组(文件名等)。因此,k
指向的内存中的内容是指向 char
的指针数组(如果您愿意,可以使用字符串,但请记住 C 中没有字符串)。然后,您将 k
(实际上是指针)写入管道,这是无意义的,因为地址不能在进程之间共享。因此,您在父级中获得的是指针的值(不代表父级中某些内容的内存地址)写为字符(如您所说的胡言乱语)。
所以你需要自己写字符串。例如文件名:
write(fd0[1],k[0],strlen(k[0])+1); // write the "string" pointed by k[0]
现在的问题是正确读取它,因为在父级中你不知道要读取的长度......你必须解码你所读取的内容,找到每个字符串的末尾并将它复制到某处的缓冲区.