Como funciona / var / lib / dpkg / lock?

3

/ var / lib / dpkg / lock é um arquivo que contém um bloqueio quando "Um gerenciador de pacotes está funcionando". Mas como esse sistema funciona? Eu tenho / var / lib / dpkg / lock toda vez que tenho Linux funcionando. Quando eu uso um gerenciador de pacotes para o dpkg eu o tenho sem nenhuma mudança. Então não consigo ver isso em ação.

    
por YarLinux 08.04.2013 / 17:06

1 resposta

6

Eu não sei ao certo, mas é mais provável que isso seja implementado via flock() . A chamada do sistema flock() cria um bloqueio consultivo em um arquivo. Se outro aplicativo tentar obter um bloqueio no arquivo, o kernel bloqueará até que o bloqueio original tenha desaparecido, ou retornará EWOULDBLOCK se a opção LOCK_NB for fornecida. Esse mecanismo de bloqueio permitiria que o arquivo de bloqueio fosse usado sem excluí-lo e recriá-lo.

Atualização: Verificou a fonte e confirmou que é um bloqueio consultivo, mas não usa flock() diretamente. fcntl é usado:

enquiry.c:

        if (modstatdb_is_locked())
          puts(_(
"Another process has locked the database for writing, and might currently be\n"
"modifying it, some of the following problems might just be due to that.\n"));
        head_running = true;
      }

dbmodify.c:

modstatdb_is_locked(void)
{
  int lockfd;
  bool locked;

  if (dblockfd == -1) {
    lockfd = open(lockfile, O_RDONLY);
    if (lockfd == -1)
      ohshite(_("unable to open lock file %s for testing"), lockfile);
  } else {
    lockfd = dblockfd;
  }

  locked = file_is_locked(lockfd, lockfile);

  /* We only close the file if there was no lock open, otherwise we would
   * release the existing lock on close. */
  if (dblockfd == -1)
    close(lockfd);

  return locked;
}

file.c:

file_is_locked(int lockfd, const char *filename)
{
    struct flock fl;

    file_lock_setup(&fl, F_WRLCK);

    if (fcntl(lockfd, F_GETLK, &fl) == -1)
        ohshit(_("unable to check file '%s' lock status"), filename);

    if (fl.l_type == F_WRLCK && fl.l_pid != getpid())
        return true;
    else
        return false;
}

dpkg.h:

#define LOCKFILE          "lock"

Na% man_de% manpage:

   Advisory locking
       F_GETLK,  F_SETLK  and  F_SETLKW  are  used to acquire, release, and test for the existence of record locks (also known as file-segment or file-region locks).  The third
       argument, lock, is a pointer to a structure that has at least the following fields (in unspecified order).
    
por 08.04.2013 / 17:38

Tags