C包装器删除命令“上的用户”;ps";

C包装器删除命令“上的用户”;ps";,c,linux,apache,console,C,Linux,Apache,Console,我有一个问题也许这里有人能帮我。如果我在linux控制台上执行“ps aux--sort user”,那么我就有一个用户列表及其在机器上运行的进程。我的问题是如何在C程序中删除用户名并像这样打印列表: 例如: (…) -------------------------------------------------------------------------- user: APACHE -----------------------------------------------------

我有一个问题也许这里有人能帮我。如果我在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并不是您问题的答案,但在unix中用户名是区分大小写的,所以将它们全部大写可能不是一个好主意。如果您想让它们在视觉上脱颖而出,那么“USER:apache”会更好


除此之外,bmdhacks的答案是好的(但不完全正确)。您可以在awk中执行类似的操作,但它会更加复杂。

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

除此之外,bmdhacks的答案是好的(但不完全正确)。您可以在awk中执行类似的操作,但它会更加复杂。

这应该可以:

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命令中,使其不输出标题。

这应该可以:

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,这样它就不会输出头了。

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


我要运行的命令如下:ps aux--sort user | sort_by_user。。。此选项“按用户排序”不存在。。在C中创建一些进程来运行该命令,使用fork()和execlp()命令很简单,但在C中创建该命令的一些选项我并没有任何想法

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


我要运行的命令如下:ps aux--sort user | sort_by_user。。。此选项“按用户排序”不存在。。在C中创建一些进程来运行该命令,使用fork()和execlp()命令很简单,但在C中创建该命令的一些选项我并没有任何想法

你有很多选择,这取决于你想在C语言中完成多少

最简单的方法是使用system()运行shell命令(如我之前发布的命令)来完成全部工作。system()实际上会生成一个shell,因此重定向之类的操作将与从命令行执行的操作一样有效

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

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


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

您有许多选项,这取决于您想在C中完成多少工作

最简单的方法是使用system()运行shell命令(如我之前发布的命令)来完成全部工作。system()实际上会生成一个shell,因此重定向之类的操作将与从命令行执行的操作一样有效

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

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


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

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

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

我通过重定向标准输出并编辑它解决了我的问题。

我通过重定向标准输出解决了我的问题和编辑它。

我理解你对吗:你想要按用户分组的进程列表?我理解你对吗:你想要按用户分组的进程列表?这不太正确,因为\w匹配字母数字和下划线,但其他字符在用户名中有效。特别是连字符非常常见(例如www数据),这不太正确,因为