В колледже я изучаю связь между процессами, и у меня есть это упражнение, где я должен получить ссылку родительского процесса на ребенка через канал, ребенок запускает команду 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
Я был бы благодарен, если бы кто-то мог объяснить мне это поведение.