Порождение процесса - найти ошибку в коде - C (СИ)
Формулировка задачи:
такое задание:
Главный процесс создает дочерний процесс, записывает ему в канал текстовоое сообщение, дочерний процесс распечатывает это сообщение на экран. После этого главный процесс выводит на экран pid дочернего процесса и посылает сигнал SIGALRM дочернему процесссу. После прихода этого сигнала дочерний процесс прекращает свою работу.
Помогите найти ошибку, и по возможности как нибудь модифицировать в лучшую сторону
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdio.h> int pid; void hand(int s) { printf("%d",pid); kill(pid,SIGALRM); } int main(int argc, char **argv) { char *str="abcdefg"; int fd[2]; char buf[80]; pipe(fd); if ((pid=fork())==-1) exit(1); if (pid) { //батя signal(SIGTRAP,hand); close(fd[0]); write(fd[1],str, strlen(str)); close(fd[1]); while(1); } else { //сына close(fd[1]); read(fd[0], buf, strlen(str)); write(1, buf, strlen(str)); close(fd[0]); kill(getppid(),SIGTRAP); for (; ;) {} } }
Решение задачи: «Порождение процесса - найти ошибку в коде»
textual
Листинг программы
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdio.h> int pid; void hand(int s) { printf("%d",pid); fflush(stdout); kill(pid,SIGALRM); } int main(int argc, char **argv) { char *str="abcdefg\n"; int fd[2]; char buf[80]; pipe(fd); if ((pid=fork())==-1) exit(1); if (pid) { //батя signal(SIGUSR1,hand); close(fd[0]); write(fd[1],str, strlen(str)); close(fd[1]); while(1); } else { //сына close(fd[1]); read(fd[0], buf, strlen(str)); write(1, buf, strlen(str)); close(fd[0]); kill(getppid(),SIGUSR1); for (; ;) {} } }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы.
- Объявляется переменная
pid
, которая будет хранить идентификатор процесса. - Определяется функция
hand
, которая будет обрабатывать сигнал SIGUSR1. - В функции
main
создается новый процесс с помощьюfork()
. - Если процесс успешен, то родительский процесс (батя) закрывает канал ввода (fd[0]), записывает строку в канал вывода (fd[1]) и вечно блокируется в цикле.
- Если процесс не удалось создать, то выходим с помощью
exit(1)
. - В дочернем процессе (сыне) закрывается канал вывода (fd[1]), читается строка из канала ввода (fd[0]), записывается в стандартный вывод и закрывается канал ввода (fd[0]).
- Дочерний процесс посылает сигнал SIGUSR1 родительскому процессу и заходит в бесконечный цикл.
- Родительский процесс получает сигнал SIGUSR1 и выводит идентификатор процесса.
- Процессы блокируются в бесконечном цикле.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д