2

これは私の最初のプログラムです....ctrlcsignal.c

enter code here
#include<stdio.h>
#include<unistd.h>
#include<signal.h>



void signal_handler(int sigNo)
{
    //if Ctrl+c signal
if(sigNo==SIGINT){
    printf("value of SIGINT:-%d\t",SIGINT);
    printf("received SIGINT\n");
}

// if some other signal , but this part wont get executed
 // as the signal_handler function is registered with SIGINT only
else
{   
    printf("Some other signal found");
    printf("value of other signal:-%d",sigNo);
}

}

int main(void)
{
//registering the signal handler function with a signal
kill(19574,SIGUSR1);
if(signal(SIGINT,signal_handler)==SIG_ERR)
{   
    printf("\n can't catch SIGINT\n");
}

while(1)          //infinite loop
    sleep(1); // 1s ,so that the CPU is not busy 

    return 0;
 }

そしてこれは私の2番目のプログラム....userdefinedsignals.c

enter code here
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void signal_handler(int sigNo)
{


printf("function entered...");
// check for userdefined Signal SIGUSR1
 if (sigNo == SIGUSR1)
{
    printf("received SIGUSR1 with value :- %d",SIGUSR1);
}
//checking for KILL Signal
else if (sigNo == SIGKILL)
{
    printf("received SIGKILL with value :- %d",SIGKILL);
}
//checking for STOP Signal
else if (sigNo == SIGSTOP)
{
    printf("received SIGSTOP with value :- %d",SIGSTOP);
}
// if some other signal , but this part wont get executed
// as the signal_handler function is registered with SIGINT only
else
{
    printf("Some other signal found");
    printf("value of other signal:-%d",sigNo);
}

}


int main(void)
{

int pid_t;
printf("process id is %d",getpid());

//registering the signal handler function with a signal

if(signal(SIGUSR1,signal_handler) == SIG_ERR)
{
    printf("\n can't catch SIGSIGUSR1\n");
} 
if(signal(SIGKILL,signal_handler)==SIG_ERR)
{
    printf("\n can't catch SIGKILL\n");
}
 if(signal(SIGSTOP,signal_handler)==SIG_ERR)
{
    printf("\n can't catch SIGSTOP\n");
}

 while(1)          //infinite loop
    sleep(1); // 1s ,so that the CPU is not busy

return 0;
}

2番目のプロセスのpidを取得します...xxxxとすると、次のコマンドを使用します... enter code here kill -USR1 xxxx

しかし、何も表示されません....また、最初のプログラムで次の関数を呼び出してみました...しかし、使用しません.. enter code herekill(xxxx、SIGUSR1);

助けて..!!!!

4

2 に答える 2

1

ここで動作します。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

#include <stdarg.h> /* vsnprintf() */
#include <signal.h> /* signal */

void myprintf(FILE *fp, char *fmt, ...)
{
char buff[512];
int rc,fd;
va_list argh;
va_start (argh, fmt);

rc = vsnprintf(buff, sizeof buff, fmt, argh);
if (rc < 0  || rc >= sizeof buff) {
        rc = sprintf(buff, "Argh!: %d:\n", rc);
        }

if (!fp) fp = stderr;
fd = fileno(fp);
if (fd < 0) return;
if (rc > 0)  write(fd, buff, rc);
return;
}

void signal_handler(int sigNo)
{
switch (sigNo ) {
case SIGUSR1:
    myprintf(NULL, "received SIGUSR1 with value :- %d\n", SIGUSR1);
    break;
case SIGKILL:
    myprintf(NULL, "received SIGKILL with value :- %d\n", SIGKILL);
    break;
case SIGSTOP:
    myprintf(NULL, "received SIGSTOP with value :- %d\n", SIGSTOP);
    break;
default:
    myprintf(NULL, "Some other signal occured: %d\n", sigNo);
    break;
        }
return;
}

int main(void)
{
pid_t mypid;
mypid = getpid();
printf("process id is %d\n",  (int) mypid);

if(signal(SIGUSR1,signal_handler) == SIG_ERR)
        { printf("\n can't catch SIGSIGUSR1\n"); }
if(signal(SIGKILL,signal_handler)==SIG_ERR)
        { printf("\n can't catch SIGKILL\n"); }
if(signal(SIGSTOP,signal_handler)==SIG_ERR)
        { printf("\n can't catch SIGSTOP\n"); }
if(signal(SIGCONT,signal_handler)==SIG_ERR)
        { printf("\n can't catch SIGCONT\n"); }

while(1)  {
    sleep(1);
    }

return 0;
}
于 2012-12-27T22:00:29.670 に答える
0

信号は正常にキャッチされていますが、回線を適切に終了しておらず、システムの標準出力ストリームが回線バッファリングされているため(プログラムが端末で実行されていると想定)、メッセージは表示されません。

標準Cは、出力ストリームの3つのレベルのバッファリングを定義しています。

  • バッファなし、出力はすぐに送信されます
  • 行バッファリングされ、改行文字が検出されたときに出力が送信されます
  • 完全にバッファリングされ、内部バッファがいっぱいになると出力が送信されます

(これは単純化です。詳細については、Cリファレンスまたは標準を参照してください)。

検討:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("Hello");
    pause();
}

これにより、端末に出力が生成されません。行を終了して修正します。

printf("Hello\n");

これにより、端末で期待される出力が生成されます。

stdoutが端末に接続されていない場合(たとえば、ファイルにリダイレクトする場合)、ストリームは完全にバッファリングされます。これ:

./a.out > foo

Ctrl-C

cat foo

改行文字が追加されても、出力は生成されません。ここでは、バッファがいっぱいになる前に出力を送信するための明示的なフラッシュが必要です。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("Hello\n");
    fflush(stdout);
    pause();
}

これにより、ファイルにリダイレクトされた場合でも出力が生成されます。

于 2012-12-27T21:06:13.220 に答える