C 子进程不随kill一起死亡(pid_t,SIGTERM)

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

我正在用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
    {
        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");