2016-06-24 16 views
0

sshセッションで実行されるプログラムを実行しています意味私は/etc/bash.bashrcファイルを使用してプログラムが起動するputtyを使用してLinuxに接続します。プログラムが終了すると仮定して、パテを介したsshセッションを切断する必要があります。 以下のコードでこれまでに行ったことがなく、動作しません:プログラムが終了し、linuxシェルにとどまります。 。私が期待したのは、putty sshセッションを終了するコマンド "exit"です。Cを使用してlinuxに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"); 

     } 

ありがとうございました。

+2

「うまくいかない」とは決して適切な問題の説明ではありません。観察された正確な期待行動と実際の行動を記述してください。 – kaylum

+0

ありがとう、 – timgold

+0

まだ分かりません。 「Linuxシェルにとどまる」とはどういう意味ですか?リモートシェル?ローカルシェル?ログを表示できる場合に最適です。 'system'は新しいプロセスを開始します。したがって、 'exit'を実行するためにそれを使用しても、現在のプロセスは終了しません。ただし、コードの実行が終了すると、プロセスは終了する必要があります。あなたは完全な例を提示していないので、コードが表示された後に何が起こっているのか明らかではありません(そこで終わりますか?)。 – kaylum

答えて

2

最も簡単な解決策は、Cプログラムをexecで起動してシェルを置き換えることです。 SSHセッションは、プログラムが終了すると自動的に終了します。

$ exec your_program 
+0

ありがとうございました。これは機能します。 – timgold

+0

これがうまくいく場合は、正解としてください。 –

+0

それは動作しますが、私が必要とするものは100%ではありません。私は、Cプログラムを介してsshセッションを停止する方法が必要です。私は、プログラム終了時にすべての場合にsshセッションを停止させたくありません。場合によっては、Cプログラムの終了後にsshセッションを続行したいと思っています。だから、答えは私の視点からは正しくない – timgold

1

このコードは何も達成していない:

system("exit"); 

system()runs a child process under sh

system()関数は、子プロセスかのように振る舞うもの はfork()、および子を使用して作成されましたプロセスはshユーティリティ を使用して呼び出しましたexecl()次のように:

execl(<shell path>, "sh", "-c", command, (char *)0); 

をので、system()へのお電話は、あなたがそれに渡されたexitコマンド実行shプロセス、起動する - 親プロセスに何もしない、と子プロセスが終了します。

あなたはgetppid()と親プロセスのPIDを取得し、それを殺すためにkill()を呼び出すことによって、しかし、親シェルを殺すことができます。

#include <unistd.h> 
#include <signal.h> 
... 
pid_t parent = getppid(); 
kill(parent, SIGKILL); 

SIGKILLはおそらく少し極端です - それはすぐにプロセスを殺しますプロセス自体が後でクリーンアップされる機会はありませんが、になります(この場合、ルート以外のsetuidの子プロセスを実行している場合を除きます)。何がわからない場合は、心配しないでくださいそれについて。)。 SIGTERMは極端ではない信号ですが、キャッチまたはブロックされる可能性があるため、プロセスを終了する保証はありません。 SIGINTCTRL-Cと同等で、動作する可能性もありますが、プロセスは信号を捕捉したり無視したりすることができます。 SIGQUITも使用できますが、その目的はプロセスを終了させ、コアファイルをダンプすることです。これはおそらく望ましくないものです。

関連する問題