C:叉子和信号
我想做的是创建一个持续5秒的父进程。我还希望它每秒发送一个C:叉子和信号,c,C,我想做的是创建一个持续5秒的父进程。我还希望它每秒发送一个SIGUSR1信号。听到这个信号,我想让孩子做点什么 到目前为止,我编写的代码是: void alarmHandler(int sig) { printf("\nalarm called\n"); exit(0); } void childHandler(int sig) { printf("child called"); signal(SIGUSR1, childHandler); } int ma
SIGUSR1
信号。听到这个信号,我想让孩子做点什么
到目前为止,我编写的代码是:
void alarmHandler(int sig) {
printf("\nalarm called\n");
exit(0);
}
void childHandler(int sig) {
printf("child called");
signal(SIGUSR1, childHandler);
}
int main() {
pid_t val;
if((val = fork())) { //parinte
signal(SIGALRM, alarmHandler);
printf("parent");
alarm(5);
while(1) {
kill(val, SIGUSR1);
sleep(1);
}
}else {
signal(SIGUSR1, childHandler);
printf("child");
}
return 0;
}
我得到的是:
child
parent
alarm called
我想要的是:
child
parent
child called
child called
child called
child called
child called
alarm called
您的家长有
while
循环。孩子会执行以下操作:
signal(SIGUSR1, childHandler);
printf("child");
然后退出
如果它在退出之前确实接收到SIGUSR
,则也将执行此操作
printf("child called");
signal(SIGUSR1, childHandler);
因此,您有一个作为子调用的号码打印
只需在
printf(“child”)后面加一个while(1){}
代码>您的父母拥有while
循环。孩子会执行以下操作:
signal(SIGUSR1, childHandler);
printf("child");
然后退出
如果它在退出之前确实接收到SIGUSR
,则也将执行此操作
printf("child called");
signal(SIGUSR1, childHandler);
因此,您有一个作为子调用的号码打印
只需在printf(“child”)后面加一个while(1){}
代码>在原始代码的基础上,添加两个块:
- 刷新printf:
setbuf(stdout,NULL)代码>
- 保持子项运行:
同时(1)暂停()代码>
代码列表如下所示:
#包括“stdio.h”
#包括“stdlib.h”
#包括
/*对于真实世界的程序,从信号处理程序打印不是很安全。
*信号处理程序应该尽可能少地做,最好只在这里或那里设置一个标志。
*并且该标志应声明为“volatile”。
*现实世界的例子:
*我曾经在一个使用Access数据库作为后端的系统上工作,
*在某些情况下,信号处理程序中的printf()调用会写入.mdb文件而不是stdout,
*使数据库无法修复。
*/
无效报警处理程序(int sig)
{
printf(“\n租金信号报警处理程序:超时\n”);
出口(0);
}
void childHandler(int-sig)
{
printf(“\n归档信号处理程序\n”);
//旧样式应该再次安装处理程序。
信号(SIGUSR1,childHandler);
}
int main()
{
pid_t val;
信号(SIGALRM、alarmHandler);
//如果不设置此选项,则无法生成子对象的输出。
//stdout流是缓冲的,因此只有在到达换行符后(或在被告知时)才会显示缓冲区中的内容。
setbuf(标准输出,空);
如果((val=fork()){//parint
printf(“\n租金\n”);
//@请注意,每个进程只有一个闹钟。
//如果之前设置了另一个报警,则alarm()函数将返回一个值。
//
//设置一个定时器,该定时器在超时时生成SIG报警信号。
//如果我们忽略或没有捕捉到该信号,则进程终止。
警报(5);
而(1){
睡眠(1);
kill(val,SIGUSR1);
}
printf(“\n租金退出\n”);
}否则{
信号(SIGUSR1,childHandler);
printf(“\nchild\n”);
而(1)
pause();//pause()函数暂停进程,直到捕捉到信号为止。
printf(“\n归档退出\n”);
}
返回0;
}
以及输出:
parent
child
child signal handler
child signal handler
child signal handler
child signal handler
parent signal alarm handler: times up
在原始代码的基础上,添加两个块:
- 刷新printf:
setbuf(stdout,NULL)代码>
- 保持子项运行:
同时(1)暂停()代码>
代码列表如下所示:
#包括“stdio.h”
#包括“stdlib.h”
#包括
/*对于真实世界的程序,从信号处理程序打印不是很安全。
*信号处理程序应该尽可能少地做,最好只在这里或那里设置一个标志。
*并且该标志应声明为“volatile”。
*现实世界的例子:
*我曾经在一个使用Access数据库作为后端的系统上工作,
*在某些情况下,信号处理程序中的printf()调用会写入.mdb文件而不是stdout,
*使数据库无法修复。
*/
无效报警处理程序(int sig)
{
printf(“\n租金信号报警处理程序:超时\n”);
出口(0);
}
void childHandler(int-sig)
{
printf(“\n归档信号处理程序\n”);
//旧样式应该再次安装处理程序。
信号(SIGUSR1,childHandler);
}
int main()
{
pid_t val;
信号(SIGALRM、alarmHandler);
//如果不设置此选项,则无法生成子对象的输出。
//stdout流是缓冲的,因此只有在到达换行符后(或在被告知时)才会显示缓冲区中的内容。
setbuf(标准输出,空);
如果((val=fork()){//parint
printf(“\n租金\n”);
//@请注意,每个进程只有一个闹钟。
//如果之前设置了另一个报警,则alarm()函数将返回一个值。
//
//设置一个定时器,该定时器在超时时生成SIG报警信号。
//如果我们忽略或没有捕捉到该信号,则进程终止。
警报(5);
而(1){
睡眠(1);
kill(val,SIGUSR1);
}
printf(“\n租金退出\n”);
}否则{
信号(SIGUSR1,childHandler);
printf(“\nchild\n”);
而(1)
pause();//pause()函数暂停进程,直到捕捉到信号为止。
printf(“\n归档退出\n”);
}
返回0;
}
以及输出:
parent
child
child signal handler
child signal handler
child signal handler
child signal handler
parent signal alarm handler: times up
现在我得到的是名为
的父报警child
已经不在了,更不用说child调用了
@Andrew-你把while循环放在哪里了?应在这一行printf(“child”)之后
't使用pause()
而不是无限while循环(对于CPU消耗)会更好。@JonathanLeffler-你是对的。可能