C包装器在命令“ps”上删除用户

时间:2008-10-08 14:51:23

标签: c linux apache console

我有一个问题,也许有人可以帮助我。如果我在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

(…)

我打印用户名然后我打印他的流程......任何想法?

THX

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您可以选择多种选项,具体取决于您希望在C中执行多少操作。

最简单的方法是使用system()运行shell命令(例如我之前发布的命令)来完成所有操作。 system()实际上会生成一个shell,所以像重定向这样的东西都可以像从命令行那样工作。

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

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

当然,你可以通过查看/ proc。

中的文件来完成C中的所有操作

答案 2 :(得分:0)

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

除了bmdhacks的答案是好的(但不是很正确)。你可以在awk中做类似的事情,但它会更复杂。

答案 3 :(得分: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,使其不输出标题。

答案 4 :(得分:0)

那是linux的命令行,我说的是......但那不是我想要的......我想在某个C程序中做到这一点......我要编写C程序,这样做......所以我使用fork()来创建一个执行ps aux --sort用户的进程...然后我想要另一个进程来控制进程和用户的打印... sry,如果我解释我的问题rong。

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

答案 5 :(得分:0)

使用popen并在C程序中操作重定向的stdout字符串

答案 6 :(得分:0)

我通过重定向stdout put并编辑它来解决我的问题。