C 子进程不随kill一起死亡(pid_t,SIGTERM)
我正在用C编写代码,并试图分叉一个服务器,该服务器接受来自客户端的连接到它自己的进程,但是,在我使用命令行参数终止连接后,服务器仍然在指定的端口上接受连接C 子进程不随kill一起死亡(pid_t,SIGTERM),c,linux,process,fork,C,Linux,Process,Fork,我正在用C编写代码,并试图分叉一个服务器,该服务器接受来自客户端的连接到它自己的进程,但是,在我使用命令行参数终止连接后,服务器仍然在指定的端口上接受连接 pid_t server_id; int spawn(char* func, char** argl) { pid_t cid; cid = fork(); server_id = cid; if(cid!=0) return cid; else { exec
pid_t server_id;
int spawn(char* func, char** argl)
{
pid_t cid;
cid = fork();
server_id = cid;
if(cid!=0)
return cid;
else
{
execvp(func, argl);
int errcode = errno;
fprintf(stderr, "Error reached: %s\n",strerror(errcode));
abort();
}
}
c是一个多线程服务器,可以接受来自多个客户端的连接。我没有包括它的代码,因为我相信在终止进程时,它的线程会被终止?因为子pid在父函数中不是持久的,而子pid恰好是侦听端口的服务器,所以我这样做
strcpy(command,"lsof -t -i:"); //get pid of process listening to port number
strcat(command,argv[2]); //concatenate port
in = popen(command,"r");
fgets(temp,5,in); //save output from running command
printf("%s\n",temp);
server_id = atoi(temp);
fprintf(stderr, "TERMINATING server %d\n", server_id);
kill(server_id,SIGTERM);
printf("SERVER TERMINATED\n");
什么是
server\u id
?server\u id
只是一个pid\u t
整数变量,它是cid的值或子进程id。它是否打印了“server TERMINATED”?服务器id确实是子进程pid,您可以在服务器路径服务器二进制文件中重写SIGTERM信号处理程序吗?如果您从终端手动kill-TERM
,会发生什么情况?这会终止您的服务器吗?在发出kill()
之前,您可能需要添加调试语句fprintf(stderr,“终止服务器%d\n”,服务器id)
为确保您正在终止正确的进程,此打印的内容是终止服务器0,由于某种原因,fork()
的返回值始终为0
strcpy(command,"lsof -t -i:"); //get pid of process listening to port number
strcat(command,argv[2]); //concatenate port
in = popen(command,"r");
fgets(temp,5,in); //save output from running command
printf("%s\n",temp);
server_id = atoi(temp);
fprintf(stderr, "TERMINATING server %d\n", server_id);
kill(server_id,SIGTERM);
printf("SERVER TERMINATED\n");