C 什么';一个进程知道另一个进程何时终止的最佳方法是什么?
我正在用C编写代码,我想知道是否有一种方法可以让另一个进程知道另一个进程是否通过线程或命名管道终止,或者使用信号是否更好?最好的办法是什么C 什么';一个进程知道另一个进程何时终止的最佳方法是什么?,c,multithreading,unix,pipe,signals,C,Multithreading,Unix,Pipe,Signals,我正在用C编写代码,我想知道是否有一种方法可以让另一个进程知道另一个进程是否通过线程或命名管道终止,或者使用信号是否更好?最好的办法是什么 更多信息:我没有使用套接字。只有FIFO和线程。我有一个进程是服务器。另一个是客户。当服务器关闭时,我想让客户机知道并关闭它。谢谢 有些部分是葡萄牙语。我希望你能理解上下文:/ util.h servidor.c-服务器文件 c-客户端文件 这些过程是如何关联的?一方是另一方的父母吗?有什么祖宗关系吗?或者它们是无关的?需要知道的进程是否具有与死亡进程相同
更多信息:我没有使用套接字。只有FIFO和线程。我有一个进程是服务器。另一个是客户。当服务器关闭时,我想让客户机知道并关闭它。谢谢 有些部分是葡萄牙语。我希望你能理解上下文:/
util.h servidor.c-服务器文件 c-客户端文件
这些过程是如何关联的?一方是另一方的父母吗?有什么祖宗关系吗?或者它们是无关的?需要知道的进程是否具有与死亡进程相同的特权(相同的EUID)?可能还有其他相关的问题。我有一个进程,那就是服务器。另一个是客户。当服务器关闭时,我想让客户机知道并关闭它。我希望我说清楚了。我还很生疏。谢谢。非常感谢您的帮助:)您没有回答@JonathanLeffler向您提出的任何问题。如果您需要更及时的通知-因此客户端关闭,即使它当时不尝试与服务器对话-那么您需要考虑让客户端告诉服务器它的PID是什么,因此,在它死之前,服务器可以向客户端发送适当的信号(SIGTERM或SIGHUP spring)。这假设服务器有权向客户机发送信号——我以前问过,但还没有解决。我们喜欢看到MCVE()是有原因的;它使我们不必为了得到我们需要帮助的信息而费尽心机。
#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);
}