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 através 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 licenciado.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 (i.e., uma biblioteca de chamadas do sistema) para arquivos, procedimentos e terminais de E / S. A biblioteca de pacotes C POSIX para plataformas POSIX é uma estrutura da biblioteca padrão C. Isso é estabelecido ao mesmo tempo que o padrão ANSI C. Para tornar 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 threads sem sua interação para operar juntos. 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é mesmo semáforos. Em estruturas do tipo 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 V do framework antigo e os semáforos POSIX modernos tornam-se dois tipos de semáforos. Chamadas de semáforo POSIX são muito mais fáceis do que chamadas de semáforo 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. 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 semáforo.h
- Empilhe o código conectando-se com -lpthread -lrt.
Quase todos os métodos e formas do Semaphore POSIX 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 para.
>> int sem_init (sem_t * sem, int pshared, valor int sem sinal);Sem_wait
Estaremos usando o método sem-wait para segurar / 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 desperta.
>> int sem_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.
>> int sem_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 * valp);Sem_destroy
Você deve usar o método sem_destroy se quiser destruir o semáforo. Se o fim do semáforo continuar, nenhum tópico ficará 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 este propósito, abra seu terminal de comando e tente o comando abaixo.
$ sudo apt-get install gcc
Afirme sua ação batendo Y.
Implementação do POSIX Semaphore com programação C no Ubuntu
No início, você deve criar um novo arquivo com um .extensão cpp no Ubuntu 20.04 sistema. Para isso, você deve navegar até o seu diretório pessoal e criar um novo arquivo vazio chamado novo.cpp. Você também pode criá-lo usando o comando touch em seu terminal de comando.
Você pode ver que o novo.O arquivo cpp foi criado no diretório inicial.
Após a criação do .arquivo cpp, abra-o como um 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.
$ gcc nome do arquivo.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 se uniria diretamente, e isso aparecerá 4-2 = 2 segundos depois de 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.