問題は次のとおりです。このプログラムはstdinから入力を受け取り、挿入されたバイト数をカウントする必要があります。SIGUSR1信号はメインプログラムを停止し、SIGUSR1を送信したときにコピーされたバイト数をファイル標準エラーに出力します。
それが私の先生が私にこれをすることを望んでいる方法です:1つのターミナルで実行します
cat /dev/zero | ./cpinout | cat >/dev/null
一方、2番目の端末から信号を送信します
kill -USR1 xxxx
ここで、xxxxはcpinoutのpidです。
以前のコードを更新しました:
/* cpinout.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#define BUF_SIZE 1024
volatile sig_atomic_t countbyte = 0;
volatile sig_atomic_t sigcount = 0;
/* my_handler: gestore di signal */
static void sighandler(int signum) {
if(sigcount != 0)
fprintf(stderr, "Interrupted after %d byte.\n", sigcount);
sigcount = countbyte;
}
int main(void) {
int c;
char buffer[BUF_SIZE];
struct sigaction action;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
action.sa_handler = sighandler;
if(sigaction(SIGUSR1, &action, NULL) == -1) {
fprintf(stderr, "sigusr: sigaction\n");
exit(1);
}
while( c=getc(stdin) != EOF ) {
countbyte++;
fputc(c, stdout);
}
return(0);
}