Я знаю, что это старая тема, но я нашел ее, и она очень помогла на рабочем столе Fedora 28. Агрессивный мод TX работал временно, но настоящей проблемой был TKIP. Если у вас есть доступ администратора к вашему маршрутизатору, вы можете изменить безопасность на wpa2 (AES ).
Переместите 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]);
}