Skip to content

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

License

Notifications You must be signed in to change notification settings

luciana-pereira/minitalk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

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

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published