Порождение процесса - найти ошибку в коде - 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 (; ;) {}           
        
    }
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы.
  2. Объявляется переменная pid, которая будет хранить идентификатор процесса.
  3. Определяется функция hand, которая будет обрабатывать сигнал SIGUSR1.
  4. В функции main создается новый процесс с помощью fork().
  5. Если процесс успешен, то родительский процесс (батя) закрывает канал ввода (fd[0]), записывает строку в канал вывода (fd[1]) и вечно блокируется в цикле.
  6. Если процесс не удалось создать, то выходим с помощью exit(1).
  7. В дочернем процессе (сыне) закрывается канал вывода (fd[1]), читается строка из канала ввода (fd[0]), записывается в стандартный вывод и закрывается канал ввода (fd[0]).
  8. Дочерний процесс посылает сигнал SIGUSR1 родительскому процессу и заходит в бесконечный цикл.
  9. Родительский процесс получает сигнал SIGUSR1 и выводит идентификатор процесса.
  10. Процессы блокируются в бесконечном цикле.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5