簡體   English   中英

使用C退出到Linux的ssh會話

[英]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是次極端的信號,但是由於它可能被捕獲或阻塞,因此不能保證結束進程。 SIGINTCTRL-C等效,也可以工作,但是該過程仍然可以捕獲或忽略信號。 也可以使用SIGQUIT ,但其目的是使進程退出並轉儲您可能不想要的核心文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM