C /按ctrl + c多次提升信号?

时间:2011-06-01 12:40:33

标签: c signals

按下ctrl+c后,我得到以下输出。关于代码,为什么线signal 2 was raised, exiting...出现几次,即使我只按键一次?

我的输出如下:

-sh-2.05b# ./proxyp 192.168.1.100
shmget id: 65538
signal 10 was raised, should write out
signal 10 was raised, should write out
signal 2 was raised, exiting...
signal 2 was raised, exiting...
signal 2 was raised, exiting...
signal 2 was raised, exiting...
signal 2 was raised, exiting...

我处理信号的线程的源代码就是这样(程序尚未完成,所以不要担心共享内存或其他任何东西):

/* global variables */
wuint32 sh_id;

/* signal handlers */
void sgn_exit_programm(int sig, siginfo_t *siginfo, void *context);
void sgn_write_stdout(int sig, siginfo_t *siginfo, void *context);

/* main thread */
void *mgmtSrvcThread(port_configuration_data *p) {
struct sigaction sig_action_exit, sig_action_write;

shared_data sh_data = p->sh_mem;
sh_id = sh_data.shm_id;

wuint32 shm, shmid;

if((shmid = shmget(MEMKEY, MAXMYMEM, 0666)) < 0) {
    perror("shmget");
    exit(1);
}

if((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
    perror("shmat");
    exit(1);
}

/* Set up the structure to specify the new action */
sig_action_exit.sa_handler = sgn_exit_programm;
sig_action_write.sa_handler = sgn_write_stdout;
sigaction(SIGINT, &sig_action_exit, NULL);
sigaction(SIGUSR1, &sig_action_write, NULL);

while(1) {
    sleep(1);
}

return (void*)0;
}


void sgn_write_stdout(int sig, siginfo_t *siginfo, void *context) {
    printf("signal %d was raised, should write out\n", sig);
}


void sgn_exit_programm(int sig, siginfo_t *siginfo, void *context)
{
    printf("signal %d was raised, exiting...\n", sig);
    sleep(1);
    exit(0);
}

也许更多关于它:我在主人中处理几个线程。其中一个线程只是一个管理线程,它将处理输出到stdout并处理信号。来源在上面。在共享内存中,将显示该消息应该写入stdout的消息。就是这样。

添加更多代码后,

更新,确保多次调用该处理程序。

void sgn_exit_programm(int sig, siginfo_t *siginfo, void *context)
{
printf("signal %d was raised, exiting...\n", sig);
fflush(stdout);
if(shmdt(data) < 0) {
    perror("shmdt");
    exit(1);
} else {
    printf("detached successful\n");
}

sleep(1);
exit(0);
}

这就是它的输出,正如你所看到的,分离任务成功完成了一次:

-sh-2.05b# ./proxyp 192.168.1.100
shmget id: 65538
signal 2 was raised, exiting...
detached successful
signal 2 was raised, exiting...
shmdt: Invalid argument
signal 2 was raised, exiting...
shmdt: Invalid argument
signal 2 was raised, exiting...
shmdt: Invalid argument
signal 2 was raised, exiting...
shmdt: Invalid argument

提前致谢。

2 个答案:

答案 0 :(得分:1)

请勿在信号处理程序中“正常工作”。设置一个标志并在正常的程序流程中处理它。使用信号和线程也很有趣。我的猜测是事情变得混乱,因为不止一个线程看到信号并试图对它作出反应。我相信“主”线程是唯一应该接收信号的线程,但它可能是未定义的(已经有一段时间了,抱歉)。

此链接也可能有用(谷歌搜索的第一个网站): http://uw714doc.sco.com/en/SDK_sysprog/PTL_ThdsSigs.html

如果你在某处设置一个位(全局变量或其他东西),你将能够至少处理程序正常流程中的信号,如果信号发生两次,它只会将位设置为true两次没有任何后果。

答案 1 :(得分:0)

可能是printf信号处理程序中的SIGINT语句驻留在stdout缓冲区中,因此当每个线程都退出时,它会打印该语句&amp;然后退出。

您可以在fflush(stdout);声明&amp;之后加上printf()声明吗?再试一次。

相关问题