0

我有一个问题,也许这里有人可以帮助我。如果我在 linux 控制台上执行“ps aux --sort user”,我有一个用户列表及其在机器上运行的进程。我的问题是如何删除用户名并在 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() 运行一个 shell 命令(比如我之前发布的那个)来完成所有工作。system() 实际上会生成一个 shell,因此重定向之类的操作都将像在命令行中一样工作。

如果你想避免使用 system() 你可以自己做,产生两个进程并将它们链接在一起。查找 pipe() 和 dup2()。大概是在浪费时间。

您可以运行 ps 程序并在 C 中解析其输出。 pipe() 和 dup2() 再次相关。对于实际的解析,我只是使用普通的 C 字符串处理例程来完成,因为它非常简单。显然,您可以改用正则表达式库,但我认为在这种情况下,它会导致比没有它更复杂的代码。

当然,您可以通过查看 /proc 中的文件在 C 中完成所有工作。

于 2008-10-09T14:36:44.013 回答
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) 将 h 添加到 ps 命令中,使其不输出标题。

于 2008-10-08T16:03:29.083 回答
0

不是您问题的真正答案,但用户名在 unix 中区分大小写,因此将它们全部大写可能不是一个好主意。如果你想让它们在视觉上脱颖而出,那么“USER: apache”会更好。

除此之外,bmdhacks 的回答很好(但不太正确)。你可以在 awk 中做类似的事情,但它会更复杂。

于 2008-10-08T15:53:39.040 回答
0

I solved my problem by redirecting the stdout put and editing it.

于 2008-10-10T10:45:19.660 回答
0

在 C 程序中使用 popen 并操作重定向的标准输出字符串

于 2008-10-09T14:43:07.903 回答
0

这是 linux 的命令行来实现我所说的......但这不是我想要的......我想在一些 C 程序中实现它......我必须编写 C 程序来实现它......所以我使用 fork () 创建一个执行 ps aux --sort user... 的进程,然后我想用另一个进程来控制进程和用户的打印... 对不起,如果我解释我的问题 rong。

我要运行的命令是这样的: ps aux --sort user | sort_by_user ...此选项 sort_by_user 不存在。使用命令 fork() 和 execlp() 在 C 中创建一些进程以运行该命令很简单,但在 C 中为该命令创建一些选项我没有任何想法。

于 2008-10-09T10:40:09.873 回答