C - 使用signal()终止进程

时间:2013-06-07 00:07:41

标签: c linux process named-pipes

我有一台服务器和一台客户端。客户端可以选择终止服务器。

对于即时通讯使用:

void killServer()
{
    int server_p_id;
FILE *file;

file = fopen(SERVER_INFO, "r");
if(file == NULL)
{
    fprintf(stderr, "\nErro ao abrir %s", SERVER_INFO);
    exit(EXIT_FAILURE);
}

fscanf(file, "%d", &server_p_id);
fclose(file);

kill -9 -server_p_id;
unlink(SERVER_FIFO);
}

/* some code */

if (!strcasecmp("fim",buffer)) 
            {
                signal(SIGUSR1, killServer);
                break;
            }

问题是该过程没有被终止。这是正确的方法吗?

编辑:当前代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include "dict.h"

#define MAX 256

void killServer()
{
    int server_p_id;
    FILE *file;

    file = fopen(SERVER_INFO, "r");
    if(file == NULL)
    {
        fprintf(stderr, "\nErro ao abrir %s", SERVER_INFO);
        exit(EXIT_FAILURE);
    }

    fscanf(file, "%d", &server_p_id);
    fclose(file);

    kill(server_p_id, SIGKILL);
    unlink(SERVER_FIFO);
}


int main()
{
    int s_fifo_fd;   /* identificador do FIFO do servidor */
    int c_fifo_fd;   /* identificador do FIFO deste cliente */
    pergunta_t perg; /* mensagem do "tipo" pergunta */
    resposta_t resp; /* mensagem do "tipo" resposta */
    char buffer[80]; /* para a leitura da palavra a traduzir */
    char c_fifo_fname[25]; /* nome do FIFO deste cliente */
    long fflags;
    int read_res;
    CLEAR;

    //Abrir fifo do servidor
    s_fifo_fd = open(SERVER_FIFO, O_WRONLY); /* bloqueante */
    if (s_fifo_fd == -1)
        {
            fprintf(stderr, "\nO servidor não está a correr\n");
            exit(EXIT_FAILURE);
        }

    //Cria fifo para receber resposta do servidor
    perg.pid_cliente = getpid();
    sprintf(c_fifo_fname, CLIENT_FIFO, perg.pid_cliente);
    if (mkfifo(c_fifo_fname, 0777) == -1)
        {
            fprintf(stderr, "\nErro no FIFO para a resposta (1)");
            close(s_fifo_fd);
            exit(EXIT_FAILURE);
        }

    //Abre o fifo para receber a resposta do servidor
    c_fifo_fd = open(c_fifo_fname, O_RDONLY | O_NONBLOCK);
    if (c_fifo_fd == -1)
        {
            fprintf(stderr, "\nErro no FIFO para a resposta (2)\n");
            close(s_fifo_fd);
            unlink(c_fifo_fname);
            exit(EXIT_FAILURE);
        }

    fflags = fcntl(c_fifo_fd, F_GETFL);
    fflags ^= O_NONBLOCK; /* inverte a semântica de bloqueio */
    fcntl(c_fifo_fd, F_SETFL, fflags); /* bloqueante = on */

    perg.palavra[TAM_MAX-1] = '\0';

    printf("\tIntroduza os comandos pretendidos\n\n");

    /* Ciclo Principal */

    while (1)   /* caso escreva "fim" o programa termina */
        {

            /* ---- a) OBTEM PERGUNTA ---- */
            printf("[ADMIN] ");
            scanf("%s",buffer);

            if (!strcasecmp("fim",buffer)) 
            {
                signal(SIGUSR1, killServer);
                break;
            }

            strncpy(perg.palavra,buffer,TAM_MAX-1); //copia a palavra lida do "buffer" para a "perg.palavra"

            /* ---- b) ENVIA A PERGUNTA ---- */
            write(s_fifo_fd, & perg, sizeof(perg));

            /* ---- c) OBTEM A RESPOSTA ---- */
            read_res = read(c_fifo_fd, & resp, sizeof(resp));
            if (read_res == sizeof(resp))
                printf("[SERVER] %s\n", resp.palavra);
            else
                printf("Sem resposta ou resposta incompreensivel[%d]\n",read_res);
        }

    close(c_fifo_fd);
    close(s_fifo_fd);
    unlink(c_fifo_fname);

    printf("Programa Terminou com Exito!");
    return 1;
}

1 个答案:

答案 0 :(得分:3)

kill是一个函数指针。标准C不允许对函数指针进行指针运算,尽管许多编译器将其作为(相当无意义的)扩展提供。

简而言之,您的代码无效C.

然而,完全有效的C代码kill(server_p_id, SIGKILL);可能会做你想要的。