LINUX.ORG.RU

особенности ftok


0

1

ftok возвращает разные ключи при одинаковых входных параметрах... почему?

код следующий:

#include <...>

static bool work = false;

void sig_handler( int sn ) {
  if( sn == SIGTERM ) {
    work = false;
  }
}

int main() {

  /* daemonize */

  key_t shm_key = ftok( "/var/run/mydaemon.pid", 1 );
  printf( "(i) key = %d\n", shm_key );

  int shm_id = shmget( shm_key, 0x10000, 0666 );
  if( shm_id == -1 ) shm_id = shmget( shm_key, 0x10000, IPC_CREAT|0666 );
  void *ptr = shmat( shm_id, 0, 0 );
  signal( SIGTERM, sig_handler );

  work = true;
  while( work ) pause();

  /* shmctl( shm_id, IPC_RMID, 0 ); */
  shmdt( ptr );
  return 1;

}

вот лог из консоли:

$ g++ -static -o mydaemon mydaemon.cpp
$ ./mydaemon
(i) key = 33587520
$ pkill -SIGKILL mydaemon
$ ./mydaemon
(i) key = 33587520
$ pkill -SIGTERM mydaemon
$ ./mydaemon
(i) key = 33587510

первый раз закрываю именно с помощью SIGKILL, т.е. по идее разделяемый сегмент остается в памяти, второй раз SIGTERM, и только после второго закрытия, ключ меняется на другой... почему? по идее ведь должен генерироваться тот же...


> вот лог из консоли:

Точно лог? Что-то я не припомню сигналов SEGKILL и SEGTERM.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Ага, точно, вернее сейчас точный... очепятка на счет SEG была, сейчас поправил.

mrs ()

А файл mydaemon.pid у тебя, наверное, не существует?

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

существует. он во время демонизации создается

mrs ()
Ответ на: комментарий от mrs

> существует. он во время демонизации создается

Лог у тебя не соответствовал действительности, исходник до сих пор не соответствует?

tailgunner ★★★★★ ()
Ответ на: комментарий от mrs

существует. он во время демонизации создается

http://pubs.opengroup.org/onlinepubs/009695399/functions/ftok.html

The ftok() function shall return the same key value for all paths that name the same file, when called with the same id value, and return different key values when called with different id values or with paths that name different files existing on the same file system at the same time. It is unspecified whether ftok() shall return the same key value when called again after the file named by path is removed and recreated with the same name.

mukoh ()
Ответ на: комментарий от tailgunner

Ну в общем да, исходник более объемный. Выше я писал о сути вопроса, поэтому привел упрощенный вариант исходника. Однако, сейчас попробовал только этот упрощенный вариант исходника, он всегда генерит один и тот же ключ, независимо от того как убивать процесс...

Видимо, в моем случае, причина генерации разных ключей в чем то ином, хотя входные параметры точно всегда одинаковые и файл существует... разбираюсь дальше.

mrs ()
Ответ на: комментарий от mukoh

mukoh, угу, точно. файл пересоздается при каждом входе. по всей видимости это и есть причина.

всем спасибо.

буду внимательнее изучать доки!

mrs ()

static bool work = false;

facepalm.eps

static volatile sig_atomic_t work = 0;
anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.