POSIX Semáforos com Programação C

Posix Semaphores With C Programming



POSIX refere-se à interface portátil do sistema operacional, que é um padrão IEEE, desenvolvido para auxiliar a portabilidade de diferentes aplicativos. POSIX é um esforço para construir uma versão padronizada comum do UNIX por meio da colaboração de fornecedores. Isso tornaria a portabilidade de aplicativos entre plataformas de hardware mais fácil se eles fossem eficazes. A Hewlett-Packard está integrando POSIX em seu MPE / iX OS versão 5.0 e HP / UXX versão 10.0, respectivamente (seu UNIX).

O padrão POSIX tem muito mais do que dez partes, no entanto, duas são facilmente obtidas. POSIX.1 descreve interfaces de programação C (ou seja, uma biblioteca de chamada de sistema) para arquivos, procedimentos e terminais de E / S. A biblioteca de pacotes C POSIX para plataformas POSIX é uma estrutura da biblioteca C padrão. Isso é estabelecido ao mesmo tempo que o padrão ANSI C. Para tornar o POSIX compatível com o padrão C, várias tentativas foram feitas. POSIX fornece recursos adicionais aos implementados no padrão C.







POSIX Semáforos

Um semáforo é uma estrutura de dados frequentemente usada para sincronizar os processos e auxiliar os encadeamentos sem sua interação entre si para operar em conjunto. A interface para semáforos é especificada pelo padrão POSIX. Não faz parte do Pthreads. No entanto, a maioria dos UNIXes que suportam Pthreads fornecem até semáforos. Em estruturas semelhantes ao Unix, como o Linux, semáforos são mesclados com filas de mensagens e memória comum sob os serviços de comunicação entre processos (IPC). Os semáforos da estrutura V mais antigos e os semáforos POSIX modernos tornam-se dois tipos de semáforos. A chamada do Semaphore POSIX é muito mais fácil do que as chamadas do Semaphore do System V. Embora os semáforos do System V sejam mais fáceis de obter, especialmente em plataformas semelhantes ao Unix anteriores. É necessário conectar programas usando semáforos POSIX à biblioteca Pthread. Vamos dar uma olhada nos semáforos POSIX neste artigo.



Por que POSIX Semáforos?

Há um grande problema em torno dos threads, que é a condição de corrida. É uma circunstância em que dois threads procuram obter e alterar as mesmas informações, tornando-as conflitantes. Para evitar uma condição de corrida, temos usado semáforos há muito tempo.



Os semáforos estão disponíveis em 2 tipos:





Semáforo Binário :

Também é reconhecido como um bloqueio mutex. Ele teria apenas dois valores possíveis, 0 e 1. O valor será inicializado como 1. Ele está sendo usado para impor vários processos para resolver o problema sério da seção.



Contando semáforo :

Seu tamanho pode variar em um domínio irrestrito. Ele está sendo usado para ter autoridade sobre o acesso a recursos de várias instâncias.

O framework Linux POSIX tem seu repositório Semaphore integrado. Para usá-lo, devemos:

  • Adicionar semaphore.h
  • Empilhe o código conectando-se com -lpthread -lrt.

Quase todos os métodos e formas do POSIX Semaphore são prototipados ou especificados em ‘Semaphore.h’. Estaremos usando o semáforo para descrever uma entidade ou objeto como:

>>sem_t sem_name;

Aqui estão as diferentes funções que usaríamos no POSIX Semaphore.

Sem_init

Para inicializar um semáforo, você deve usar o método sem_init. Nesta função, sem corresponde a um objeto semáforo inicializado. Pshared é um banner ou sinalizador que especifica se o semáforo pode ser compartilhado com um procedimento bifurcado () ou não. Semáforos compartilhados atualmente não são reforçados por LinuxThreads. O valor do argumento é o valor inicial no qual o semáforo é fixado.

>> intsem_init(sem_t*sem, intpshared, não assinado intvalor);

Sem_wait

Estaremos usando o método sem-wait para manter / bloquear um semáforo ou fazê-lo esperar. Se o semáforo foi fornecido com um valor negativo, o ciclo de chamada será bloqueado automaticamente. Sempre que qualquer outro thread chama sem_post, um dos processos já obstruídos é ativado.

>> intsem_wait(sem_t*sem);

Sem_post

Estaremos usando o método sem_post para aumentar o valor de um semáforo. Ao chamar, sem_post irá incrementar o valor, e um dos processos já obstruídos ou em espera desperta.

>> intsem_post(sem_t*sem);

Sem_getvalue

Se você quiser saber sobre o valor de um semáforo, você deve usar a função sem_getvalue abaixo. Ele obterá o valor presente do semáforo e será colocado no destino apontado por Valp.

>>Int sem_getvalue(sem_t*sem, int *cachorro);

Sem_destroy

Você deve usar o método sem_destroy se quiser destruir o semáforo. Se o fim do semáforo continuar, nenhum segmento estará esperando no semáforo.

>>Int sem_destroy(sem_t*sem);

Instale o utilitário GCC

Para compilar o código POSIX Semaphore C, você deve ter o utilitário gcc instalado em seu sistema Linux. Para isso, abra seu terminal de comando e tente o comando abaixo.

$sudo apt-get install gcc

Afirme sua ação batendo E .

Implementação do POSIX Semaphore com programação C no Ubuntu

No início, você deve criar um novo arquivo com uma extensão .cpp no ​​sistema Ubuntu 20.04. Para isso, você deve navegar até o seu diretório pessoal e criar um novo arquivo vazio chamado new.cpp. Você também pode criá-lo usando o comando touch em seu terminal de comando.

Você pode ver que o arquivo new.cpp foi criado no Diretório pessoal.


Após a criação do arquivo .cpp, abra-o como Editor de Texto em seu sistema Linux e escreva o código abaixo neste arquivo como ele está. Depois disso, salve e feche-o.

Execute o programa POSIX Semaphore C no Ubuntu 20.04

Abra seu terminal no Ubuntu 20.04 e execute o comando gcc abaixo seguido do nome do arquivo.

$gccfilename.c –lpthread –lrt

Existem 2 fios formados, um é formado após 2 segundos do outro. Depois de receber o parafuso, o primeiro segmento dorme por 4 segundos. Então, depois de ter sido chamado, o segundo encadeamento não entraria diretamente e isso aparecerá 4-2 = 2 segundos após ter sido chamado. Aqui está o resultado:

Se não tivéssemos usado o semáforo, de acordo com a troca de contexto, o resultado poderia ter sido o observado:

Conclusão

Neste guia, uma visão geral detalhada do uso de POSIXSemaphore com programação C no Ubuntu 20 foi fornecida. Simplesmente usando a biblioteca POSIX ou Pthread em determinado código C, o Semaphore POSIX pode ser facilmente usado para evitar condições de corrida durante a codificação.