什么是流程知道何时终止另一个流程的最佳方式?

时间:2016-12-26 20:49:28

标签: c multithreading unix pipe signals

我在C编码,我想知道是否有另一个进程可以知道另一个进程是否通过线程或命名管道终止,或者信号更好?最好的办法是什么?

更多信息:我不使用套接字。只有十五和线程。我有一个进程是服务器。另一个客户。当服务器关闭时,我希望客户端知道它并关闭。感谢

有些部分是葡萄牙语。我希望你能理解上下文:/

util.h

#define FIFO_SERV "cli.txt"
typedef struct{
    char u[10], pass[10];
    char op;
    int pid;
    int acesso;
   //int FIM;
 } PEDIDO;

servidor.c - 服务器文件

#include "util.h"

int main(int argc, char *argv[]) {

FILE *f_dados;
int fd, fd_resp, i;
char cmd[20], user[10], pwd[10], users[100], str[80];
PEDIDO p;

fd_set conj;
struct timeval tempo;
int ret;


    mkfifo(FIFO_SERV, 0600);
    fd = open(FIFO_SERV, O_RDWR); //vai ler para escrever

    printf("Servidor iniciado...\n");


    f_dados = fopen(argv[1], "w+");
    do{
        FD_ZERO(&conj);
        FD_SET(0 ,&conj);   //ATENCAO AO TECLADO!
        FD_SET(fd, &conj);     //ATENCAO AO FIFO!
        tempo.tv_sec = 1;      //ESPERA 1.5 SEGUNDOS
        tempo.tv_usec = 50000;

        ret = select(fd+1, &conj, NULL, NULL, &tempo);

        if(ret > 0){    //existem dados
            if(FD_ISSET(0, &conj)){         // ... no teclado!

                scanf("%s", cmd);

                if(strcmp(cmd, "user") == 0){
                    f_dados = fopen(argv[1], "a+");
                    if (f_dados == NULL)
                    {
                        printf("NÃO FOI POSSIVEL A ABERTURA DO FICH.\n");
                        return 1;
                    }

                    scanf("%s %s", user, pwd);
                    fprintf(f_dados, "%s %s\n", user, pwd);
                    printf("\t#user adicionado\n");

                    fclose(f_dados);
                }
                else if(strcmp(cmd, "users") == 0){
                    f_dados = fopen(argv[1], "r+");
                    if (f_dados == NULL)
                    {
                        printf("NÃO FOI POSSIVEL A ABERTURA DO FICH.\n");
                        return 1; 
                    }

                    while(fgets(users, 100, f_dados)) {
                        printf(">%s\n", users);
                    }
                }
                else if(strcmp(cmd, "sair") == 0){
                    break;
                }
                else{
                    printf("\tComando inválido.\n\n");
                }
            }
            if(FD_ISSET(fd, &conj)){         // ... no fifo!
                i = read(fd, &p, sizeof(p));
                if(i==sizeof(p)){
                    printf("Recebi um pedido...");
                    printf("Pedido: %s %s {%d}\n", p.u, p.pass, p.pid);

                    autenticacao(f_dados, &p);
                    //ENVIAR RESPOSTA...
                    sprintf(str, "cli%d", p.pid);
                    fd_resp = open(str, O_WRONLY);
                    i = write(fd_resp, &p, sizeof(p));
                    close(fd_resp);

                    printf("Enviei a resposta...\n");
                }
            }
        }
    }while(strcmp(cmd, "sair") != 0);

    close(fd);

    fclose(f_dados);

    printf("Vou terminar!\n");

    unlink(FIFO_SERV);

    }

    return(0);
} 

cliente.c - 客户端文件

#include "util.h"
    int main(void) { 

        int fd, i, fd_resp, res;
        char str[80]; //buffer para guardar dados
        PEDIDO p;

        if (access(FIFO_SERV, F_OK) != 0){
            printf("O servidor nao esta a correr!\n");
            return 1;
        }

        p.pid = getpid();
        sprintf(str, "cli%d", p.pid);
        mkfifo(str, 0600);

        fd = open(FIFO_SERV, O_WRONLY);
        do{
            //INTERFACE
            printf("\nLogin: ");
            scanf("%s", p.u);
            printf("Password: ");
            scanf("%s", p.pass);

    //        printf("\nPEDIDO: %s - %s\n", p.u, p.pass);
            //INTERFACE... ainda falta

            i = write(fd, &p, sizeof(p));
            printf("\nPedido enviado...");

            //RECEBE RESPOSTA...
            fd_resp = open(str, O_RDONLY);
            i = read(fd_resp, &p, sizeof(p));
            close(fd_resp);

            printf("Recebi a resposta... {%d}\n", p.acesso);
            if(p.acesso == 0){
                printf("\n\t[Não autenticado.]\n");
            }
            else if(p.acesso == 1){
                printf("\n\t[Autenticado.]\n");
            }

        }while(!p.acesso && strcmp(p.u, ".") != 0);


        close(fd);

        unlink(str);
        return(0);
    }

0 个答案:

没有答案