我有一个问题,也许有人可以帮助我。如果我在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
答案 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并编辑它来解决我的问题。