1

プログラムが 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;
}
4

1 に答える 1

2

operator precedenceについて読む必要があります。この線

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

あなたが思っていることをしません!

実際、コンパイラはそれを次のように認識します

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

これは、とりわけ、execl通常の子プロセスではなく、親プロセスで実行することを意味します。


あなたの問題に関しては、シェル固有のもの(組み込みコマンド、パイプなど)を実行しようとしているが、実際にはシェルを実行していないためです。

execシェルを使用するか、関数などを使用する必要がありsystemます。

于 2013-10-27T15:10:58.693 に答える