Ir ao conteúdo

Posts recomendados

Postado

Boa tarde a todos,

Estou fazendo um trabalho pra faculdade, que é criar um web-server em C, onde ele deverá ser capaz de aceitar múltiplas requisições, onde cada requisição deverá ser atendida por uma thread. Para que o usuário termine sua execução, eu devo captar o sinal SIGUSR1 através do comando:

kill -SIGUSR1 <PID>

Eu consegui fazer todo o servidor, porém estou com 2 problemas nesse trabalho:

1-Fazer com que o servidor rode em background

2-Manter o terminal que eu executei o ./web_server limpo para que o usuário possa fazer as requisições/SIGUSR1 por ele mesmo. 

A minha função main está assim até o momento:

#include "main.h"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "sigHandler.h"


char *testes = "./testes.sh";

int main(int argc, char *argv[]) {
    Command *command = extractCommandOptions(argc, argv);
    
    pid_t id;
    int status;
    if ((id = fork()) < 0) {
        puts("Erro na criação do novo processo");
        exit(-2);
    } else if (id == 0) {
        serverRun(command);
        system(testes);
        exit(0);
    } else {
        wait(&status);
        statisticsPrint(command );
    }

    //signal(SIGUSR1, sigHandler);
    return 0;
}

 

O arquivo ./testes.sh é um script shell que eu fiz para automatizar o teste de múltiplas requisições em paralelo, o código dele é este:

#!/bin/bash
check_port() {
    ss -tuln | grep -q ":$1 "
    return $?
}

if check_port 8080; then
    SERVER_URL="http://localhost:8080"
else
    SERVER_URL="http://localhost:3030"
fi

FILES=("index.html" "hinoBotafogo.txt" "loccoAbreu.jpeg" "erroHTML.html" "erroTEXTO.txt" "erroIMG.jpeg")

NUM_REQUESTS=50

make_request() {
    local file=$1
    curl -s -o /dev/null -w "%{http_code} %{url_effective}\n" "$SERVER_URL/$file"
}

for FILE in "${FILES[@]}"
do
    for ((i=1; i<=NUM_REQUESTS; i++))
    do
        make_request "$FILE" &
    done
done

wait

echo "Test completed with $NUM_REQUESTS requests for each file."

 

Alguém tem alguma dica/recomendação de estruturação do código para que eu possa realizar essa execução em background? 

  • Curtir 2
Postado
7 horas atrás, Estalha disse:

1-Fazer com que o servidor rode em background

2-Manter o terminal que eu executei o ./web_server limpo para que o usuário possa fazer as requisições/SIGUSR1 por ele mesmo.

 

Não entendo o que quer dizr com "terminal limpo". A ideia de rodar em background é justamente não ter um terminal associado. Pode ser tão simples quanto colocar um & depois do comando para rodar o programa.

 

Em geral o que faz é usar um pool e criar threads já de início ou ter um contador e esperar as requisições chegarem. O processo do servidor é único.

 

E para desligar pode usar qualquer terminal, por exemplo digitando control-alt-f3 abre um novinho no Linux... E escreva um programa que abre a lista de processos e vê se o servidor está rodando e manda o sinal pra ele encerrar. É mais simples e adequado.

  • Curtir 2
Postado

Obrigado pela ajuda @arfneto, eu realmente tinha interpretado de maneira errada o enunciado. Estava pensando muito além do q deveria, ele já está rodando em background. Mas de qualquer forma, agradeço pela ajuda. 

Postado

@Estalha Se vai rodar em background é algo chamado daemon em Linux/Unix/Ios/Android ou serviço no Windows. Está bem documentado no caso do Windows, tem até um exemplo em Microsoft Learning.  No caso do Linux pode ver no manual direto, em man daemon eu acho, e outras páginas. Depende um pouco do que precisa fazer. 

 

Um daemon não pode ser filho do seu processo de logon, de seu shell de login, ou quando fechar sua sessão ele morre também. Deve estar rodando tendo o processo init como parent. E não deve ter stdin stdout ou stderr abertos.

 

E pra encerrar deve identificar o número do processo e mandar o tal sinal. 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!