我正在运行一个运行在ssh会话上的程序。意思是我使用putty连接到linux,程序启动,使用/etc/bash.bashrc文件。在某些时候程序假设结束并且使用它通过putty的ssh会话应该断开连接。 我现在直到使用下面的代码完成了什么,它不起作用:程序退出,并保留在linux shell中,意味着putty已连接。我期望的是命令“exit”结束putty ssh session
char file_name[20];
pid_t pid = fork();
if (pid == 0)
{
printf("Starting vi\r\n");
char external_cmd[200] = "vi ";
strcat(external_cmd, file_name);
system(external_cmd);
} else
{
waitpid(pid,0,0);
printf("Exit..\r\n");
system("exit");
}
感谢您的帮助。
答案 0 :(得分:2)
最简单的解决方案是使用exec
启动您的C程序,以便它替换shell。当程序退出时,SSH会话自然会结束。
$ exec your_program
答案 1 :(得分:1)
这段代码没有做任何事情:
system("exit");
system()
runs a child process under sh
:
system()
函数的行为就像子进程一样 使用fork()
创建,子进程调用sh
实用程序 使用execl()
如下:execl(<shell path>, "sh", "-c", command, (char *)0);
因此,您对system()
的调用会启动一个sh
进程,然后执行您传递给它的exit
命令 - 子进程退出,对父进程不执行任何操作。
但是,您可以通过使用getppid()
获取父进程的PID然后调用kill()
来终止它来终止父shell:
#include <unistd.h>
#include <signal.h>
...
pid_t parent = getppid();
kill( parent, SIGKILL );
SIGKILL
可能有点极端 - 它会立即杀死一个进程,进程无法自行清理,但它将工作(除非你是&#39;在这种情况下运行非root setuid子进程 - 如果你不知道那是什么,不要担心它。)。 SIGTERM
是一个不那么极端的信号,但由于它可以被捕获或阻止,因此不能保证结束进程。 SIGINT
相当于CTRL-C
,也可能有效,但该过程可以再次捕获或忽略该信号。 SIGQUIT
也可以使用,但它的目的是让进程退出并转储您可能不想要的核心文件。