답변:
(중복 된 / 닫힌 질문에 대답하려면 실행중인 프로세스를 일시 중지하거나 중지 하려면 어떻게해야 합니까?) , 재개 후 응용 프로그램 충돌시 어떻게해야하는지 묻습니다.
kill -STOP $PID
& 다음에 제대로 재개되지 않는 프로세스가 있습니다 kill -CONT $PID
. 이 경우 CRIU로 검사 점 / 복원을 시도 할 수 있습니다 . 오버 헤드가 마음에 들지 않으면 일시 중단 할 수있는 가상 시스템에서 프로세스를 실행할 수도 있습니다.
SIGSTOP / SIGCONT 이후 프로세스가 재개되지 않는 한 가지 이유는 프로세스가 중지 된 후 SIGCONT를 통해 재개 될 때 Linux에서 일부 차단 시스템 호출이 EINTR과 함께 실패하기 때문입니다. 가입일 신호 (7) :
정지 신호에 의한 시스템 호출 및 라이브러리 기능 중단
Linux에서 신호 핸들러가없는 경우에도 프로세스가 중지 신호 중 하나에 의해 중지 된 후 SIGCONT를 통해 재개 된 후 특정 차단 인터페이스가 EINTR 오류와 함께 실패 할 수 있습니다. 이 동작은 POSIX.1에 의해 승인되지 않았으며 다른 시스템에서는 발생하지 않습니다.
[...]
영향을받는 시스템 호출 중 하나는 epoll_wait (2) 입니다. 예:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <sys/epoll.h>
int
main(int argc, char *argv[])
{
int fd = 0;
int efd = epoll_create(1);
if (efd == -1) {
perror("epoll_create");
exit(1);
}
struct epoll_event ev;
memset(&ev, 0, sizeof(ev));
ev.events = EPOLLIN;
ev.data.fd = fd;
if (epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev) == -1) {
perror("epoll_ctl");
exit(1);
}
int res = epoll_wait(efd, &ev, 1, -1);
if (res == -1) {
perror("epoll_wait");
exit(1);
}
if (ev.events & EPOLLIN && ev.data.fd == fd) {
printf("Received input\n");
}
return 0;
}
컴파일하고 실행하십시오.
$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+ Stopped ./example
$ fg
./example
epoll_wait: Interrupted system call
EINTR
나타납니다 SIGCONT
. 프로그램 SIGCONT
은 전송 될 때까지 중지 된 상태로