没有死亡的子进程(pid_t,SIGTERM)

时间:2017-08-23 23:56:42

标签: 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
    {
        execvp(func, argl);
        int errcode = errno;
        fprintf(stderr, "Error reached: %s\n",strerror(errcode));
        abort();
    }

}

...

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

    do{
        next_option = getopt_long (argc, argv, short_options,long_options, NULL);
        switch (next_option)
        {
            case 'h':   /* -h or --help */
                print_usage (stdout, 0);

            case 's':  ; /* -s or --start-server */
                char* arglist[] = {"server",argv[2],NULL}; //argv[2] is the port number
                spawn(server_path,arglist);
                break;

            case 'x':   /* -t or  --transport */
                kill(server_id,SIGTERM);
                printf("SERVER TERMINATED\n");
                break;

        //more stuff

    return 0;
}

server.c是一个多线程服务器,可以接受来自多个客户端的连接。我没有包含它的代码,因为我相信在终止进程时它的线程被它杀死了吗?

1 个答案:

答案 0 :(得分:0)

因为子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");