2017-11-24 11 views
0

Ubuntuでは、/ proc/'pid'/exeを読み込むことで、実行プロセスのexeのフルパスを抽出することができます。solarisで実行中のプロセスの実行可能ファイルの完全なパスをプログラマチックに取得する方法は?

solarisでは/ proc/'pid'に 'exe'ファイルはありません。 私はpsinfoを読んだ。しかし、それはプロセスと議論のちょうど名前を与えます。 exeの完全なパスを持っていません。 ソラリスでどうすればいいですか? 私のsolarisバージョンは11.3です。コマンドを通じて

+0

Solaris 11.3 SRU 5.6以上はありますか? –

+1

[psinfo \ _t solarisの複写がそのフィールドに完全なプロセス名を含んでいない可能性があります](https://stackoverflow.com/questions/35888100/psinfo-t-solaris-does-not-contain-full-process-name-フィールド内) –

答えて

3

、あなたは次のように実行しているexeファイルのフルパスを取得することができます:例えばのために

# ls -l /proc/<pid>/path/a.out 

# ls -l /proc/$$/path/a.out 
lrwxrwxrwx 1 root  root   0 Nov 24 17:19 /proc/14921/path/a.out -> /usr/bin/bash 

このようにして、実行可能なパスを取得できます。例えば:

# readlink -f /proc/$$/path/a.out 
/usr/bin/bash 

をするために

# readlink -f /proc/<pid>/path/a.out 

そしてプログラムで、あなたはこのようにそれを行うことができます:

よりとても便利な方法です

# ./a.out <pid> 

#include <stdio.h> 
#include <unistd.h> 

#define BUF_SIZE 1024 

int main(int argc, char *argv[]) { 
    char outbuf[BUF_SIZE] = {'\0'}; 
    char inbuf[BUF_SIZE] = {'\0'}; 
    ssize_t len; 

    if (argc != 2) { 
      printf ("Invalid argument\n"); 
      return -1; 
    } 

    snprintf (inbuf, BUF_SIZE, "/proc/%s/path/a.out", argv[1]); 

    if ((len = readlink(inbuf, outbuf, BUF_SIZE-1)) != -1) { 
      outbuf[len] = '\0'; 
    } else { 
      perror ("readlink failed: "); 
      return -1; 
    } 

    printf ("%s\n", outbuf); 
    return 0; 
} 

それは使い方です

+0

Re 'readlink'。これは、デフォルトではSolaris 11ホストにインストールされています。これは* GNU Coreutils *パ​​ッケージの一部です。大域ゾーンには常に存在しますが、デフォルトでは、そのパッケージは 'solaris-small-server' IPSグループ(デフォルトではローカルゾーンが取得する)の一部ではないため、ローカルゾーンにはなりません。つまり、ローカルゾーンでは、 'pkg install gnu-coreutils'を明示的にインストールする必要があります。しかし、あなたは[ベストプラクティス](https://unix.stackexchange.com/questions/66415/solaris-default-install-user-tools)をとにかく考慮する必要があります。 – peterh

0

Solarisではわかりませんが、いくつかの古いUnixでは、コマンド名はargv[0]であっただけです。次に、PATH環境変数でそのコマンドを正しい順序で検索して、コマンドのフルパスを見つけるためにを検索しなければなりませんでした。

ビットマニュアルでも弾丸です。

関連する問題