2

したがって、Cで実行中にプロセス名を変更するというこのタスクがあり、これに出くわしました: http://www.uofr.net/~greg/processname.html

何よりもまず、私は argv[0] を変更することの危険性を認識しています (ただし、Linux と UNIX についてはまだ長い道のりがあります) ので、それについて講義しないでください。 Ubuntuに取り組んでいます。

私が使用したテストソースは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(int argc, char *argv[]) {

    int argv0size = strlen(argv[0]);
    int onetwothree = 1;
    char* abc = (char *) malloc(sizeof(char) * (17 + 1));
    sprintf(abc,"ApplicationName%.3d",onetwothree); 
    strncpy(argv[0], abc ,argv0size);     
    getchar(); 
}

Mac OS X と Ubuntu のみでテストしましたが、Mac OS X で動作しています。なぜ Ubuntu で動作しないのかわかりません。機能しない理由として考えられるものは何ですか?

コンパイラとして gcc を使用しています。

4

2 に答える 2

3

したがって、Cで実行中にプロセス名を変更するというこのタスクがあり、これに出くわしました: http://www.uofr.net/~greg/processname.html

あなたが使用したリファレンスは、OS または C の専門家によって書かれたものではないことをお勧めします。おそらく一部のOS では機能しますが、C でそのように機能する必要はありません。

何よりもまず、私は argv[0] を変更することの危険性を認識しています (ただし、Linux と UNIX についてはまだ長い道のりがあります) ので、それについて講義しないでください。 Ubuntuに取り組んでいます。

WhozCraig がコメントで述べたように、argv 配列とそれが指す配列を変更することは確かに許可されています。これは、Ubuntu がプロセス リストでその変更を使用する必要があるという意味ではありません。

Mac OS X と Ubuntu のみでテストしましたが、Mac OS X で動作しています。なぜ Ubuntu で動作しないのかわかりません。機能しない理由として考えられるものは何ですか?

根拠を探している場合は、悪用の可能性を考えてください。独自の のコピーがargv[0]プロセス リストで使用された場合、kaiten などのトロイの木馬は、以前のようにプロセス名を偽造して、検出と削除をより困難にすることができます。

于 2013-04-03T04:03:11.017 に答える
2

残念ながら、C では argv[0] が実際にプロセス名であるという保証はありません。Unix/Linux では、親プロセスが使用することを選択した任意の値にすることができます (「execv/execve」を参照)。つまり、実装に基づいている可能性がありますが、必ずしもプロセス名にマップされるとは限りません。

Ubuntu (そしておそらく MacOS?) の場合、以下はより普遍的なものになるはずです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __linux__
#include <sys/prctl.h>
#endif

void main(int argc, char *argv[]) {

  int argv0size = strlen(argv[0]);
  int onetwothree = 1;
  char* abc = (char *) malloc(sizeof(char) * (17 + 1));
  sprintf(abc,"ApplicationName%.3d",argv0size); 
  #ifdef __linux__
    prctl(PR_SET_NAME, abc, 0, 0, 0);
  #else
    strncpy(argv[0], abc ,argv0size);     
  #endif
  getchar(); 
}

編集:実際のアプリケーション名を削除しました。
EDIT_2: prctl は OS X では利用できません

于 2013-04-03T04:17:42.927 に答える