使用C退出到Linux的ssh会话

时间:2016-06-24 04:12:59

标签: c linux ssh

我正在运行一个运行在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");

        }

感谢您的帮助。

2 个答案:

答案 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也可以使用,但它的目的是让进程退出并转储您可能不想要的核心文件。