다음은 부모 프로세스가 파이프에 문자열 입력을 쓰고 자식 프로세스가 파이프에서 이것을 읽는 코드입니다. 자식 프로세스가 파이프에서 "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);
}
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] 삭제
몇 마디 만하겠습니다