Почему здесь grep возвращает SIGPIPE (сигнал 13)?

Я знаю, что это старая тема, но я нашел ее, и она очень помогла на рабочем столе Fedora 28. Агрессивный мод TX работал временно, но настоящей проблемой был TKIP. Если у вас есть доступ администратора к вашему маршрутизатору, вы можете изменить безопасность на wpa2 (AES ).

0
21.04.2020, 10:29
1 ответ

Переместите if (pipe(pipefd[i]) < 0)перед fork(). В противном случае вы просто создаете два отдельных канала (в родительском и дочернем ), и вы получите SIGPIPE, когда закроете конец записи канала в дочернем (в codice_figlio()функция ), так как это единственная ссылка на нее, а не дескриптор, общий для родительского и дочернего элементов.

Это не единственная проблема; read(pipefd[i][0], buf, sizeof(int));не работает, потому что вы читаете только 4 байта из канала, но ваша функция conta_righe()пытается подсчитать количество строк в нем. Измените sizeof(int)на sizeof buf.

После этого ваш код, кажется, делает что-то разумное:

$./fo fo.c fo.c pipefd
Nel file fo.c sono state trovate 8 occorrenze di pipefd.
Nel file fo.c sono state trovate 8 occorrenze di pipefd.
*P0 (pid = 9541): Terminato processo figlio PID = 9542: Terminazione volontaria con stato 0
*P0 (pid = 9541): Terminato processo figlio PID = 9543: Terminazione volontaria con stato 0

Это патч для вашего кода (применить вручную, этот сайт коверкает вкладки):

--- fo.c~   2020-04-20 20:51:19.540914204 +0300
+++ fo.c    2020-04-20 20:51:22.648914269 +0300
@@ -42,8 +42,8 @@
     }
     signal(SIGUSR1, handler);
     for (i = 0; i < N; i++) {
-        pid[i] = fork();
         if (pipe(pipefd[i]) < 0) exit(-3);
+        pid[i] = fork();
         if (!pid[i]) {
             pause();
             codice_figlio(i, argv[argc - 1], argv[i + 1]);
@@ -55,7 +55,7 @@
         sleep(1);
         kill(pid[i], SIGUSR1);
         close(pipefd[i][1]);
-        read(pipefd[i][0], buf, sizeof(int));
+        read(pipefd[i][0], buf, sizeof(buf));
         num = conta_righe(buf);
         printf("Nel file %s sono state trovate %d occorrenze di %s.\n", argv[i + 1], num, argv[argc - 1]);
     }

1
19.03.2021, 02:27

Теги

Похожие вопросы