У меня есть следующий код обработчика sigactionобработчик sigaction не закрывает процесс
void signal_term_handler(int sig)
{
int rc = async_lockf(pid_file, F_UNLCK);
if(rc) {
char piderr[] = "PID file unlock failed!\n";
write(STDOUT_FILENO, piderr, (sizeof(piderr))-1);
}
close(pid_file);
char exitmsg[] = "EXIT Daemon:TERM signal Received!\n";
write(STDOUT_FILENO, exitmsg, (sizeof(exitmsg))-1);
_exit(EXIT_SUCCESS); //async-signal-save exit
}
Все вызовы функций в указанных выше функциях являются асинхронным сигналом сохранения. Даже async_lockf()
является асинхронным-сигналом сохранения:
/*
* The code of async_lockf is copied from eglibc-2.11.3/io/lockf.c
* The lockf.c is under the terms of the GNU Lesser General Public
* Copyright (C) 1994,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
* This file is part of the GNU C Library.
*/
int async_lockf(int fd, int cmd)
{
struct flock fl = {0};
/* async_lockf is always relative to the current file position. */
fl.l_whence = SEEK_CUR;
fl.l_start = 0;
fl.l_len = 0;
switch (cmd)
{
case F_TEST:
/* Test the async_lock: return 0 if FD is unlocked or locked by this process;
return -1, set errno to EACCES, if another process holds the lock. */
fl.l_type = F_RDLCK;
if (fcntl (fd, F_GETLK, &fl) < 0)
return -1;
if (fl.l_type == F_UNLCK || fl.l_pid == getpid())
return 0;
errno = EACCES;
return -1;
case F_ULOCK:
fl.l_type = F_UNLCK;
cmd = F_SETLK;
break;
case F_LOCK:
fl.l_type = F_WRLCK;
cmd = F_SETLK;
break;
case F_TLOCK:
fl.l_type = F_WRLCK;
cmd = F_SETLK;
break;
default:
errno = EINVAL;
return -1;
}
/* async_lockf() is a cancellation point but so is fcntl() if F_SETLKW is
used. Therefore we don't have to care about cancellation here,
the fcntl() function will take care of it. */
return fcntl (fd, cmd, &fl);
}
обработчик sigaction должен закрыть приложение, если я выполнить kill -15
команды, но несколько раз я получаю отросток работает и не выходят. это бывает редко. Например, если я запустил приложение, а затем остановился с kill -15
1000 раз, это будет происходить только ~ 5 раз
Любое объяснение этого странного поведения? Почему мое приложение не существует? Тем более, что я использую асинхронный-сигнал-сохранить функцию (_exit()
), чтобы закрыть отросток
Для этого все операции в вашем обработчике сигналов, кроме как для написания сообщений, бесполезны. Файлы автоматически закрываются, когда процесс завершается, и блокировки автоматически освобождаются при закрытии файла. –
, который отвечает за закрытие и разблокировку файла? это функция atexit(), или это планировщик linux? – MOHAMED
Когда процесс умирает, независимо от того, как он умирает, все его дескрипторы открытого файла закрыты. Возможно, вы путаете это с stdio 'FILE', который необходимо очистить как часть 'exit' в пользовательском пространстве. См. Http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html и обратите внимание, что «Последствия завершения процесса» применяются, даже если '_exit' не вызывался явно, например. если процесс завершился из-за необработанного сигнала. –