Como a zine do motd ainda não saiu, aqui vai uma prévia de um exemplo da parte em que estou explicando IPC com signals. É um criptografador/decriptografador que usa xor e pula bytes nulos de entrada e saída (vc deve saber o porquê):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
unsigned long total = 0;
char buffer[1024];
void finaliza(int);
FILE *in, *out;
int main(int argc, char *argv[])
{
unsigned int i;
size_t len;
char *senha;
if( argc < 4 )
{
printf(“Uso: %s SENHA ARQUIVO1 ARQUIVO2\n”, argv[0]);
printf(“Criptografa ARQUIVO1 usando SENHA e salva o “
“resultado em ARQUIVO2\n\n”);
return 0;
}
senha = argv[1];
if( strlen(senha) == 0 )
{
fprintf(stderr, “A senha deve conter pelo menos uma letra “
“ou dígito\n”);
return -1;
}
in = fopen(argv[2], “r”);
if( ! in )
{
perror(“Erro ao abrir arquivo de origem”);
return -1;
}
out = fopen(argv[3], “w+”);
if( ! out )
{
perror(“Erro ao abrir/criar arquivo criptografado”);
fclose(in);
return -1;
}
signal(SIGINT, finaliza);
signal(SIGTERM, finaliza);
while( ! feof(in) )
{
len = fread(buffer, 1, 1024, in);
for(i = 0;i < len;i++)
{
if( buffer[i] && buffer[i] ^ senha[i % strlen(senha)] )
buffer[i] ^= senha[i % strlen(senha)];
}
fwrite(buffer, 1, len, out);
total ++;
}
fclose(in);
fclose(out);
printf(“Criptografia finalizada com sucesso (%u KB “
“criptografados)\n”, total);
return 0;
}
void finaliza(int regs)
{
printf(“Criptografia cancelada em %u KB!\n”, total);
exit(0);
}