在大学里,我正在学习流程之间的通信,我必须进行练习,以便通过管道获得与孩子的父流程链接,孩子运行cmd sort fx.txt
并将输出发送给父母,父母应该打印。
fx.txt
的内容是
b
a
经过一番搜索,发现popen()
是一个不错的选择,下面是一些示例代码,这是我写的:
#include <stdio.h>
#include <unistd.h>
#define SIZE 255
int main() {
FILE *file;
char *cmd = "sort fx.txt";
file = popen(cmd, "r");
if (file == NULL) {
printf("error opening pipe\n");
return 1;
}
char *str;
//print sorted lines
while (fgets(str, SIZE, file) != NULL) {
printf("%s", str); // \n already stored in str
}
pclose(file);
return 0;
}
我在fgets()
的行上遇到了分段错误。
之后,我随机尝试通过创建另一个指针并将fgets()
的返回值分配给它来修复它。
更改如下:
char *str;
char *s;
//print sorted lines
while ((s = fgets(str, SIZE, file)) != NULL) {
printf("%s", str); // \n already stored in str
}
工作正常,输出为:
a
b
如果有人能向我解释这种行为,我将很感激。
答案 0 :(得分:1)
char *str;
是一个未初始化的指针。当您将fgets
用作参数时,会导致未定义的行为。分配一些实际空间并使用它:
char str[MAX_LINE_LENGTH];
MAX_LINE_LENGTH
在您的程序中很合理。