자식 프로세스가 다른 자식 프로세스를 종료 한 다음 종료하는 방법은 무엇입니까?

ChackM

다음은 부모 프로세스가 파이프에 문자열 입력을 쓰고 자식 프로세스가 파이프에서 이것을 읽는 코드입니다. 자식 프로세스가 파이프에서 "end"라는 단어를 읽으면 모든 프로세스를 종료하고 자체적으로 종료하고 "finish"라는 단어를 읽으면 아버지에게 모든 프로세스를 종료하는 신호를 보내고 종료합니다. 코드를 실행하고 세분화 오류가 발생했습니다. 왜 잘못 되었나요?

#define _POSIX_SOURCE
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
void measure_time(int sig)
{
    printf("child [%d] received signal %d\n", getpid(), sig);
}
int main(int argc, char *argv[])
{
    int n_task = 4;
    pid_t pid;
    pid_t pid_array[n_task];
    int fd[2];
    for (int i = 0; i < n_task; i++)
    {
        pid = fork();
        if (pipe(fd) == -1)
        {
            perror(" pipe ");
            exit(1);
        }
        if (pid < 0)
        {
            perror("fork");
            exit(1);
        }
        if (pid == 0) //child
        {
            char *buf;
            close(fd[1]);
            read(fd[0], buf, 10);
            printf("I read: %s", buf);
            if (strcmp(buf, "end") == 0)
            {
                for (int i = 0; i < n_task; i++)
                    kill(pid_array[i], SIGUSR1);
            }else if(strcmp(buf,"finish") == 0){
                /*Here i want father to kill all children and then exit.*/
            }
            exit(0);
        }
        close(fd[0]);
        char *buf;
        printf("Give the input string: \n");
        scanf("%s", buf);
        write(fd[1], buf, strlen(buf));
        close(fd[1]);
        pid_array[i] = pid;
    }
    sleep(1);
    for (int i = 0; i < n_task; i++)
        wait(NULL);
    return (0);
}
Yingyu YOU

buf@G로 식별되는 초기화되지 않은 문제 외에도 . Sliepen, 하위 프로세스를 분기 할 때 파일 설명자가 열린 상태로 유지되므로 pipe()이전에 호출해야합니다 fork(). 이것은 또한 파이프가 작동하는 방식입니다.

pipe()앞에 넣을 코드 스 니펫을 변경할 수 있습니다 fork().

...
        if (pipe(fd) == -1)
        {
            perror(" pipe ");
            exit(1);
        }
        pid = fork();
        if (pid < 0)
        {
            perror("fork");
            exit(1);
        }
...

예제가 제시된 pipe (2) 의 매뉴얼 페이지를 읽으십시오 .

그래서이 포스트 fork ()와 pipes ()가 c에서 이것을 설명했습니다.

프로세스 종료를위한 업데이트

이 자식 프로세스는 형제의 존재에 대한 지식이 없지만 부모 프로세스는 알고 있습니다. 명시 적으로 필요하지 않은 경우 부모가 그렇게하도록 할 수 있습니다. 즉, 모든 자식 프로세스를 "종료"할 수 있습니다.

BTW, SIGUSR1 신호를 보내는 대신 SIGTERM 신호를 보내는 것이 좋습니다. SIGUSSR1로 인해 기본적으로 대상 프로세스가 종료 될 수 있지만 ( signal (7) 참조 ).

"완료", 즉 모든 자식 프로세스와 부모 프로세스를 종료 (또는 종료)하려면 부모를 간단하게 종료 할 수 있습니다. 그 후손들도 모두 죽었습니다. 또는 동일한 프로세스 그룹에 신호를 보낼 수 있습니다. kill (2)를 참조하십시오 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

다른 자식 프로세스가 완료되면 자식 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

추가 OpenVMS 터미널 세션을 식별 한 다음 종료하는 방법은 무엇입니까?

분류에서Dev

Putty는 닫기 버튼을 클릭 한 후 프로세스를 종료합니다. 자동으로 종료하는 방법

분류에서Dev

Malloc은 Linux 환경에서 자식 프로세스를 종료합니다.

분류에서Dev

자식 스레드에 의해 시작된 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

자식 스레드에 의해 시작된 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

파이썬 다중 처리를 사용하면 자식 프로세스가 다른 자식 프로세스를 어떻게 종료 할 수 있습니까?

분류에서Dev

스크립트에서 시작된 모든 자식 프로세스가 종료되었음을 감지하는 방법은 무엇입니까?

분류에서Dev

다른 가상 콘솔에서 한 가상 콘솔의 모든 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

자식 프로세스는 부모 프로세스에서만 처리해야하는 SIGINT를 수신하여 자식이 갑자기 종료됩니다.

분류에서Dev

Python 다중 처리 : 부모 프로세스가 종료되면 자식 프로세스가 중단됩니까?

분류에서Dev

자식 종료를 유추하는 부모 프로세스의 출력은 무엇입니까?

분류에서Dev

부모 프로세스가 자식 프로세스가 종료 될 때까지 기다리는 동안 자식은 어떻게 부모 프로세스를 죽일 수 있습니까?

분류에서Dev

Systemd 및 프로세스 생성 : 기본 프로세스가 종료되면 자식 프로세스가 종료됩니다.

분류에서Dev

Systemd 및 프로세스 생성 : 기본 프로세스가 종료되면 자식 프로세스가 종료됩니다.

분류에서Dev

Systemd 및 프로세스 생성 : 기본 프로세스가 종료되면 자식 프로세스가 종료됩니다.

분류에서Dev

bash는 신호로 인해 자식 프로세스의 비정상 종료시 종료되지 않습니다.

분류에서Dev

Excel 강제 종료를 자동화 한 다음 다시 시작하는 방법은 무엇입니까?

분류에서Dev

VB6에서 다른 사용자가 소유 한 프로세스를 종료합니다.

분류에서Dev

다른 쉘 세션에서 프로세스 종료 상태를 얻는 방법은 무엇입니까?

분류에서Dev

어떤 한도가 초과되었는지 확인하는 방법은 무엇입니까? (ulimit로 인해 프로세스가 종료되었습니다.)

분류에서Dev

부모 프로세스가 종료되고 모두 초기화로 전환 된 후 모든 자식 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

다른 프로세스를 통해 관리자 권한으로 프로세스 종료

분류에서Dev

시스템이 사용자 입력에 느리게 응답 할 때 중단 프로세스를 식별하고 종료하는 방법은 무엇입니까?

분류에서Dev

시스템이 사용자 입력에 느리게 응답 할 때 중단 프로세스를 식별하고 종료하는 방법은 무엇입니까?

분류에서Dev

내 우분투를 동결한다는 것을 알고있는 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

tty 세션이 아닌 터미널의 모든 자식 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

tty 세션이 아닌 터미널의 모든 자식 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

C ++ : waitpid를 사용할 때 자식 프로세스가 종료 될 때까지 기다립니다.

Related 관련 기사

  1. 1

    다른 자식 프로세스가 완료되면 자식 프로세스를 종료하는 방법은 무엇입니까?

  2. 2

    추가 OpenVMS 터미널 세션을 식별 한 다음 종료하는 방법은 무엇입니까?

  3. 3

    Putty는 닫기 버튼을 클릭 한 후 프로세스를 종료합니다. 자동으로 종료하는 방법

  4. 4

    Malloc은 Linux 환경에서 자식 프로세스를 종료합니다.

  5. 5

    자식 스레드에 의해 시작된 프로세스를 종료하는 방법은 무엇입니까?

  6. 6

    자식 스레드에 의해 시작된 프로세스를 종료하는 방법은 무엇입니까?

  7. 7

    파이썬 다중 처리를 사용하면 자식 프로세스가 다른 자식 프로세스를 어떻게 종료 할 수 있습니까?

  8. 8

    스크립트에서 시작된 모든 자식 프로세스가 종료되었음을 감지하는 방법은 무엇입니까?

  9. 9

    다른 가상 콘솔에서 한 가상 콘솔의 모든 프로세스를 종료하는 방법은 무엇입니까?

  10. 10

    자식 프로세스는 부모 프로세스에서만 처리해야하는 SIGINT를 수신하여 자식이 갑자기 종료됩니다.

  11. 11

    Python 다중 처리 : 부모 프로세스가 종료되면 자식 프로세스가 중단됩니까?

  12. 12

    자식 종료를 유추하는 부모 프로세스의 출력은 무엇입니까?

  13. 13

    부모 프로세스가 자식 프로세스가 종료 될 때까지 기다리는 동안 자식은 어떻게 부모 프로세스를 죽일 수 있습니까?

  14. 14

    Systemd 및 프로세스 생성 : 기본 프로세스가 종료되면 자식 프로세스가 종료됩니다.

  15. 15

    Systemd 및 프로세스 생성 : 기본 프로세스가 종료되면 자식 프로세스가 종료됩니다.

  16. 16

    Systemd 및 프로세스 생성 : 기본 프로세스가 종료되면 자식 프로세스가 종료됩니다.

  17. 17

    bash는 신호로 인해 자식 프로세스의 비정상 종료시 종료되지 않습니다.

  18. 18

    Excel 강제 종료를 자동화 한 다음 다시 시작하는 방법은 무엇입니까?

  19. 19

    VB6에서 다른 사용자가 소유 한 프로세스를 종료합니다.

  20. 20

    다른 쉘 세션에서 프로세스 종료 상태를 얻는 방법은 무엇입니까?

  21. 21

    어떤 한도가 초과되었는지 확인하는 방법은 무엇입니까? (ulimit로 인해 프로세스가 종료되었습니다.)

  22. 22

    부모 프로세스가 종료되고 모두 초기화로 전환 된 후 모든 자식 프로세스를 종료하는 방법은 무엇입니까?

  23. 23

    다른 프로세스를 통해 관리자 권한으로 프로세스 종료

  24. 24

    시스템이 사용자 입력에 느리게 응답 할 때 중단 프로세스를 식별하고 종료하는 방법은 무엇입니까?

  25. 25

    시스템이 사용자 입력에 느리게 응답 할 때 중단 프로세스를 식별하고 종료하는 방법은 무엇입니까?

  26. 26

    내 우분투를 동결한다는 것을 알고있는 프로세스를 종료하는 방법은 무엇입니까?

  27. 27

    tty 세션이 아닌 터미널의 모든 자식 프로세스를 종료하는 방법은 무엇입니까?

  28. 28

    tty 세션이 아닌 터미널의 모든 자식 프로세스를 종료하는 방법은 무엇입니까?

  29. 29

    C ++ : waitpid를 사용할 때 자식 프로세스가 종료 될 때까지 기다립니다.

뜨겁다태그

보관