2017-01-23 11 views
2

私のプログラムは、あまりにも多くのメモリを消費している場合(例えば、 - firefoxやchrome)、特定のプロセスを閉じるようにユーザに提案することができます。プロセスがLinuxのシステムプロセスであるかどうかを確認するにはどうすればよいですか?

しかし私のシステム(Ubuntu 16.10 GNOME)では、gnome-shellのようなシステム固有のプロセスが多すぎるメモリを消費します。

クライアントは、特定のプロセスを閉じられるかどうかはわかりません。

プロセスがシステムプロセス(gnome-shellなど)であるかどうかを判断して閉じないでください。

FILE * pipe = popen("ps aux --sort=-%mem | awk 'NR<=2{print $2}'", "r"); 

if(pipe) 
{ 
    char line[line_buf]; 
    while(fgets(line, sizeof line, pipe) != NULL) 
    { 
     if(sscanf(line, "%d", &_pid) == 1) 
     { 
      _mem->pid = _pid; 
     } 
    } 
} 

pclose(pipe); 

if(_mem->pid != 0) { 
    char command[128], pidname[40]; 
    snprintf(command, sizeof command, "cat /proc/%d%s", _pid, "/comm"); 

    FILE * _pipe = popen(command, "r"); 
    if(pipe) 
    { 
     char line[line_buf]; 
     fgets(line, sizeof line, _pipe); 
     sscanf(line, "%s\n", pidname); 
    } 

    pclose(_pipe); 
    strcpy(_mem->pname, pidname); 
} 
+4

とPIDの含むsystemdにサービスのtreelistを得ることができ、

を(その親ダイ)デーモンをフォーク理解しますgnome-shellや他のユーザプロセスのようなものです。 linuxがメモリ不足になった場合、oom-killerは修飾された選択肢を作り、oom-conditionが終了するまでプロセスを終了しようとします。これは必ずしも完全には機能しませんが、多くの場合、それは良い仕事です! – Ctx

+0

だから基本的に私は仕事をOS自体に任せておくべきですか? –

+0

linuxに関する限り、私はそれを示唆しています – Ctx

答えて

1

IIRC、Ubuntuの16がすでにシステムD-基づいています:

これは私がPIDと最大メモリを消費するもののプロセスの名前を取得しています方法です。それにはいくつかの問題がありますが、少なくともそれは多くの既存の塊を取り除きました。実際には、システムプロセスはルートsystemdプロセスによって管理されます。それは彼らがすべてPID 1の子供であることを意味するわけではありません。 systemdはもう少し洗練されたモデルを持っています。特に、それは、「システムプロセス」のこれらの種類の間には簡単に区別はありませんあなたはsystemd-cgls(コントロールグループリスト)

関連する問題