Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:叉子和信号_C - Fatal编程技术网

C:叉子和信号

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

我想做的是创建一个持续5秒的父进程。我还希望它每秒发送一个
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-你是对的。可能