我在C编码,我想知道是否有另一个进程可以知道另一个进程是否通过线程或命名管道终止,或者信号更好?最好的办法是什么?
更多信息:我不使用套接字。只有十五和线程。我有一个进程是服务器。另一个客户。当服务器关闭时,我希望客户端知道它并关闭。感谢
有些部分是葡萄牙语。我希望你能理解上下文:/
#define FIFO_SERV "cli.txt"
typedef struct{
char u[10], pass[10];
char op;
int pid;
int acesso;
//int FIM;
} PEDIDO;
#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);
}
#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);
}