0

ここにいる誰かが私を助けてくれるかもしれません。Linux コンソールで「ps aux --sort user」を実行すると、マシン上で実行されているユーザーとそのプロセスのリストが 1 つ表示されます。私の質問は、Cプログラムでユーザー名を削除してそのリストを次のように出力する方法です:

例えば:

(…)
--------------------------------------------------------------------------
user: APACHE
--------------------------------------------------------------------------
3169 0.0 1.2 39752 12352 ? S 04:10 0:00 /usr/sbin/httpd
--------------------------------------------------------------------------
user: VASCO
--------------------------------------------------------------------------
23030 0.0 0.1 4648 1536 pts/1 Ss 20:02 0:00 –bash

(…)

ユーザー名を印刷してから、彼のプロセスを印刷します...アイデアはありますか?

どうも

4

7 に答える 7

3
ps aux --sort user | perl -npe 's/^(\w+)//g; if ($user ne $1) {$user=$1; print "user: " . uc($user) . "\n";}'
于 2008-10-08T14:54:18.287 に答える
1

Cでどの程度やりたいかによって、いくつかのオプションがあります。

最も簡単な方法は、system() を使用してシェル コマンド (以前に投稿したものなど) を実行し、すべてを実行することです。system() は実際にシェルを生成するため、リダイレクトなどはすべてコマンド ラインと同じように機能します。

system() の使用を避けたい場合は、2 つのプロセスを生成してそれらをリンクすることで、自分で行うことができます。pipe() と dup2() を参照してください。おそらく時間の無駄です。

ps プログラムを実行し、その出力を C で解析できます。ここでも、pipe() と dup2() が関連しています。実際の解析では、通常の C 文字列処理ルーチンを使用して実行します。これは非常に簡単です。明らかに、代わりに正規表現ライブラリを使用できますが、この場合、それがない場合よりも複雑なコードになると思います。

もちろん、/proc 内のファイルを参照することで、C ですべてを実行できます。

于 2008-10-09T14:36:44.013 に答える
0

あなたの質問に対する答えではありませんが、UNIXではユーザー名で大文字と小文字が区別されるため、すべてを大文字にするのはおそらく良い考えではありません。それらを視覚的に目立たせたい場合は、「USER:apache」の方が適しています。

それを除けば、bmdhacksの答えは良いです(しかし、完全には正しくありません)。awkでも同様のことができますが、かなり複雑になります。

于 2008-10-08T15:53:39.040 に答える
0

これは機能するはずです:

ps haux --sort user | perl -npe 's/^(\S+)\s+//; if ($user ne $1) {$user=$1; print "user: " . uc($user) . "\n";}'

bmdhacksの回答に基づいていますが、次の修正が加えられています。

a)ユーザー名の一部として非空白をカウントします。b)出力例のように、ユーザー名の後の空白を削除します。そうしないと、物事が整列しません。c)gを削除して取得する必要がありました。働くために。gを使用すると、多くの場合に一致する可能性があるため、perlはあいまいになる可能性があるため$1を設定しないと思います。d)ヘッダーを出力しないようにpsコマンドにhを追加しました。

于 2008-10-08T16:03:29.083 に答える
0

stdout putをリダイレクトして編集することで、問題を解決しました。

于 2008-10-10T10:45:19.660 に答える
0

それは私が言ったことを作成するためのLinuxのコマンドラインです...しかし、それは私が望むものではありません...私はそれをCプログラムで作成したいです...それを作成するCプログラムを作成する必要があります...だから私はフォークを使用します() ps aux --sort user... を実行する 1 つのプロセスを作成し、別のプロセスでプロセスとユーザーの出力を制御したいのですが... 申し訳ありませんが、私の問題を説明してください。

実行したいコマンドは次のようなものです: ps aux --sort user | sort_by_user ... このオプション sort_by_user は存在しません..そのコマンドを実行するプロセスを C で作成するのは、コマンド fork() および execlp() を使用すると簡単ですが、C でそのコマンドにいくつかのオプションを作成します。アイデア。

于 2008-10-09T10:40:09.873 に答える
0

popen を使用して、C プログラムでリダイレクトされた stdout 文字列を操作します

于 2008-10-09T14:43:07.903 に答える