GitHunt
LU

Este projeto consiste na construção de um programa na forma de um servidor e um client em C

Minitalk

Este projeto consiste na construção de um programa na forma de um server e um client em C, que se comuniquem através de dois sinais unix SIGUSR1 e SIGUSR2 (passando assim os dados em forma binária) enviados com o kill(), ou seja, envie os dados em binário via sinais unix. Recebendo bits na ordem em que são enviados.

A primeira etapa e fazer a conexão entre os dois programas, então fazemos o client enviar um sinal SIGUSR1 para o server usando o comando kill()
Com a função getpid, conseguimos pegar o ID do processo do programa do server para o qual faremos o envio do sinal, que sera reaklizado da seguinte forma:

kill(pid, SIGUSR1);

A segunda etapa e realizar a conversão de caracters ASCII em binário. A tabela ASCII representa todo os 127 caracters e seus valores, ou seja cada caracter possui um número.

A forma como os programas podem se comunicar atraves dos sinais SIGUSR1 e SIGUSR2, e faze-los representar um valor binario cada, considerando que SIGUSR1 representa 0 e SIGUSR2 representa 1, desta forma quando enviamos o sinal SIGUSR1, estamos enviando o 0 para o servidor, e quando fazemos o mesmo com o SIGUSR2, estamos enviando 1. Nesta etapa obteremos todos os bits de um caracter (8 bits em ASCII), o que significa que o servidor precisara receber os 8 sinais do client para cada caracter ASCII.

O que é Unix Signal?

Sinais (signals) é uma interrupção de software** implementadas pelos sistema operaciona que envia uma mensagem simples para um processo "de forma assíncrona" notificando-o de que algo aconteceu (evento).

O processo que recebe o sinal pode executar uma dinâmica básica predeterminada de acordo com o sinal, ignorá-lo por uma função predefinida pelo usuário ou executar um processamento especial.

Por exemplo, um Sinal ocorre quando Ctrl + c é pressionado enquanto um processo está em andamento ou quando um comando kill é emitido para um processo.

💡 interrupt: Algo que interfere com a execução normal de programas pela CPU

Portanto, podemos usar o Signal para enviar e receber sinais.

Eventos POSIX

SIGUSR1: De numero 10 e o Sinal 1 definido pelo usuário (POSIX)

SIGUSR2: De numero 12 e o Sinal 2 definido pelo usuário (POSIX)

Projeto

Servidor: Usando signal e sigaction, poderemos decidir qual ação tomar quando receber um sinal.

Cliente: Podemos enviar um sinal do cliente para o servidor usando a função kill.

Executa uma ação predeterminada ➡️ gera um sinal (função kill, programa cliente) ➡️ o processo. (sinal/sigaction, programa de servidor, funciona de forma assíncrona)

Funções utilizadas

  • signal():
    A função de signal permite especificar uma função a ser chamada quando um determinado sinal é recebido, para que possa tomar algumas medidas em resposta ao sinal. Se bem-sucedida, executa a função e retorna -1 se falhar.
void (*signal(int signum, void (*handler)(int)))(int);
  • sigemptyset():
    A função sigemptyset é utilizada para inicializar um sinal definido para o conjunto vazio, o que significa que não contém quaisquer sinais.
int sigemptyset(sigset_t *set);

Exemplo:

Neste exemplo abaixo a sigemptyset é utilizada para inicializar a mascara de sinal, que especifica os sinais que devem ser bloqueados enquanto um manipulador de sinal esta sendo executado.

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void sig_handler(int signum) {
  printf("Signal recebido %d\n", signum);
 }

int main(void) {
  struct sigaction act;
  act.sa_handler = sig_handler;
  sigemptyset(&act.sa_mask);
  act.sa_flags = 0;
  sigaction(SIGINT, &act, NULL);
  while (1) {
    //código
  }
  return (0);
 }
  • sigaddset():
    A função sigaddset permite adicionar um sinal a um conjunto de sinais. A função requer dois argumentos: um ponteiro para um conjunto de sinais e o numero do sinal a adicionar ao conjunto.
int sigaddset(sigset_t *set, int signum);
  • sigaction():
    A função sigaction é utilizado para especificar as medidas a tomar quando um sinal específico é recebido por um processo.
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

Argumentos:

  • signum: Especifica o sinal para o qual a ação está a ser especificada.
  • act: É um indicador de struct sigaction que especifica a ação a tomar.
  • oldact: É um ponteiro para uma struct sigaction que e usada para recuperar a ação anterior para o sinal especifico

Referências de estudo

Primeiros passos antes de começar a codar, entenda o projeto e o que e solicitado.

Languages

C86.0%Makefile14.0%

Contributors

MIT License
Created February 8, 2023
Updated January 13, 2025
luciana-pereira/minitalk | GitHunt