2013-06-10 4 views
1

У меня есть следующий код обработчика 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()), чтобы закрыть отросток

+1

Для этого все операции в вашем обработчике сигналов, кроме как для написания сообщений, бесполезны. Файлы автоматически закрываются, когда процесс завершается, и блокировки автоматически освобождаются при закрытии файла. –

+0

, который отвечает за закрытие и разблокировку файла? это функция atexit(), или это планировщик linux? – MOHAMED

+0

Когда процесс умирает, независимо от того, как он умирает, все его дескрипторы открытого файла закрыты. Возможно, вы путаете это с stdio 'FILE', который необходимо очистить как часть 'exit' в пользовательском пространстве. См. Http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html и обратите внимание, что «Последствия завершения процесса» применяются, даже если '_exit' не вызывался явно, например. если процесс завершился из-за необработанного сигнала. –

ответ

1

Для того чтобы увидеть, что происходит, попробуйте подключить strace или gdb к процессу и увидеть, где он застрял. Лучше всего предположить, что у вас есть код, который маскирует сигналы (sigprocmask), выполняя операцию блокировки, тем самым предотвращая запуск обработчика сигнала.

+0

На самом деле моя программа содержит потоки. У меня есть поток, который иногда посылает сигнал с 'pthread_cond_signal'. может ли это быть причиной? – MOHAMED

+0

Это не должно быть связано. Несмотря на аналогичное имя, переменные состояния сигнализации не имеют ничего общего с сигналами. –

+0

поэтому в моем коде у меня нет кода, который маскирует сигналы ('sigprocmask') при выполнении операции блокировки – MOHAMED

Смежные вопросы