我在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是一个多线程服务器,可以接受来自多个客户端的连接。我没有包含它的代码,因为我相信在终止进程时它的线程被它杀死了吗?
答案 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");