I는 신호 처리기과 같이은 sigaction을 사용하여 설정이 있습니다이상한은 sigaction()과의 getline() 상호 작용
struct sigaction act, oldact;
memset(&act, 0, sizeof(struct sigaction));
act.sa_handler = sig_handler;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGALRM);
sigaddset(&act.sa_mask, SIGINT);
sigaddset(&act.sa_mask, SIGTERM);
sigaddset(&act.sa_mask, SIGTSTP);
sigaction(SIGALRM, &act, &oldact);
sigaction(SIGINT, &act, &oldact);
sigaction(SIGTERM, &act, &oldact);
sigaction(SIGTSTP, &act, &oldact);
act.sa_flags = 0;
I 실행이 다음 입력을 수집하고 기본적으로처럼 행동 (다시 그것을 밖으로 인쇄하는 for 루프 고양이).
char *linebuf = NULL;
size_t n = 0;
int len;
while(1){
len = getline(&linebuf, &n, stdin);
if(len>0){
printf("%s", linebuf);
}
}
그러나, 일단 내가 입력, 신호 처리에서
getline()
더 이상 블록을 반환하고 중단 된 시스템 호출 인
errno
EINTR
에 설정하는 동안 대신 지속적으로
-1
를 반환합니다. 나는 분명히
getline()
을 인터럽트하려고했지만 입력을 계속 읽을 수 있도록 어떻게 재설정합니까?
내 문제를 실제로 해결하지 못하는 몇 가지 유사한 질문이 있지만 문제를 더 잘 이해하는 데 도움이 될 수 있습니다. 2
또 다른 흥미로운 재미있는 이야기 1 내가 내 신호 처리를 위해 signal()
를 사용 할 때 나는이 문제가되지 않았다이지만 POSIX 호환 때문에 sigaction()
로 변경되었습니다.
'printf (linebuf);는 아마도 유효한 C 구문이 아닙니다. – haccks
@haccks 예,'printf ("% s", linebuf); ' – Shahbaz
'printf ("% s", linebuf)로 변경했지만'printf (linebuf);'는 올바른 c 구문 (이 경고는'경고 : 문자열 리터럴 형식이 아니고 형식 인수가없는 형식 (-Wformat-security)')이지만 오류가 아니며 문제가되지 않습니다. – Connor