按下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
提前致谢。
答案 0 :(得分:1)
请勿在信号处理程序中“正常工作”。设置一个标志并在正常的程序流程中处理它。使用信号和线程也很有趣。我的猜测是事情变得混乱,因为不止一个线程看到信号并试图对它作出反应。我相信“主”线程是唯一应该接收信号的线程,但它可能是未定义的(已经有一段时间了,抱歉)。
此链接也可能有用(谷歌搜索的第一个网站): http://uw714doc.sco.com/en/SDK_sysprog/PTL_ThdsSigs.html
如果你在某处设置一个位(全局变量或其他东西),你将能够至少处理程序正常流程中的信号,如果信号发生两次,它只会将位设置为true两次没有任何后果。
答案 1 :(得分:0)
可能是printf
信号处理程序中的SIGINT
语句驻留在stdout
缓冲区中,因此当每个线程都退出时,它会打印该语句&amp;然后退出。
您可以在fflush(stdout);
声明&amp;之后加上printf()
声明吗?再试一次。