如何列出所有用户以及他们处于活动状态的进程数

时间:2013-10-27 15:03:35

标签: c linux

我有一项任务是编写一个程序,列出所有活动用户,以及当程序收到SIGHUP信号时它们处于活动状态的进程数,并在收到SIGINT信号时退出。

我已将此用于列出用户和流程计数

ps -u "$(echo $(w -h | cut -d ' ' -f1 | sort -u))" o user= | sort | uniq -c | sort -rn

这就是我的计划所在。我可能会以错误的方式解决这个问题并且可以使用一些帮助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>

void sig_handler(int signo) {
  if (signo == SIGHUP){
    int pid = 0;
    if (pid = fork() != 0) {
      execl("/bin/ps", "ps", "-u", "\"$(echo $(w -h | cut -d ' ' -f1 | sort -u))\"", "o", "user=", "|", "sort", "|",  "uniq", "-c", "|", "sort", "-rn", NULL);
    } else {
      printf("Signal received: SIGINT\nReported by: Parent process\n\n");
    }
  }
}

int main(void) {
  if (signal(SIGHUP, sig_handler) == SIG_ERR)
    printf("\nCan't catch SIGINT\n");

  while (1)
    sleep(1);
  return 0;
}

1 个答案:

答案 0 :(得分:2)

您需要了解operator precedence。这条线

if (pid = fork() != 0) {

不按照你的想法行事!

实际上编译器将其视为

if (pid = (fork() != 0)) {

除其他外,这意味着您在父进程中运行execl,而不是通常的子进程。


至于你的问题,这是因为你试图运行特定于shell的东西(嵌入式命令,管道等),但你实际上并没有运行shell。

您必须exec一个shell,或使用例如system函数。