[英]Use C to exit ssh session to linux
我正在運行一個通過ssh會話運行的程序。這意味着我使用膩子連接到linux,該程序使用/etc/bash.bashrc文件啟動。在某些時候,該程序應該以ssh會話結束並通過膩子應該斷開連接。我直到現在才用下面的代碼完成操作,但它不起作用:程序退出,並停留在linux shell中,這意味着膩子已連接。 我期望的是命令“ exit”結束膩子ssh會話。
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");
}
謝謝您的幫助。
最簡單的解決方案是使用exec
啟動C程序,以便它替換Shell。 程序退出時,SSH會話自然會結束。
$ exec your_program
這段代碼沒有完成任何事情:
system("exit");
system()
在sh
下運行一個子進程 :
system()
函數的行為應類似於使用fork()
創建子進程,並且該子進程使用execl()
調用sh
實用程序,如下所示: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
可能有點極端-它會立即殺死一個進程,進程本身沒有機會清理,但是它會起作用(除非您在這種情況下運行非root setuid子進程-如果您不這樣做,不知道那是什么,不用擔心。) SIGTERM
是次極端的信號,但是由於它可能被捕獲或阻塞,因此不能保證結束進程。 SIGINT
與CTRL-C
等效,也可以工作,但是該過程仍然可以捕獲或忽略信號。 也可以使用SIGQUIT
,但其目的是使進程退出並轉儲您可能不想要的核心文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.