【问题标题】:I have tries to write a c program using alarm function I am using it for first time but my ouput is not as per desired can someone help me with that我尝试使用警报功能编写一个 c 程序我第一次使用它,但我的输出不符合要求有人可以帮助我吗
【发布时间】:2020-11-27 13:28:14
【问题描述】:

编写一个模拟闹钟的C程序。在主函数中,你 fork 一个子进程, 并且子进程休眠5秒(秒数是命令行 参数,请参见下面的示例运行),之后子进程发送信号 (SIGALRM) 到其父进程。父进程在fork子进程之后, 暂停,在收到 SIGALRM 信号后,打印出一条消息“Ding!”。这 以下是示例运行

$ ./警报 5

报警应用程序启动

等待闹钟响起

叮!

完成

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>
#include <stdlib.h>


void Dingdong()
{
    printf("Ding!");
    exit(1);
    
}

int main(int argc, char *argv[])
{  
    
    if(argc!=3)

    {
        printf("How much seconds you want to sleep the child process\n");
    }

    int PauseSecond=(argv[1]);
    
    {
        if(fork()==0)
        {
            printf("waiting for alarm to go off\n");  
            printf("%d second pause",PauseSecond);
            sleep(PauseSecond);
            kill(getpid(),SIGALRM);
        }
        else {
            printf("Alarm application starting\n", getpid());  
            signal(SIGALRM,Dingdong);
            printf("done");
        }

    }   
    



}

【问题讨论】:

    标签: c fork parent-child computer-science alarm


    【解决方案1】:

    这就是让它无法正常工作的原因:

    1. int PauseSecond=(argv[1]); 这将第一个参数的地址放在PauseSecond 中,这通常是一个非常大的数字。您可能想改为解析第一个参数的值。您需要在其上使用 atoi 或 strtol 之类的东西来执行此操作。
    2. 您在分叉后调用getpid(),因此孩子将信号发送给自己而不是父母。在 fork 之前调用 getpid() 并将其保存到变量中,或者改为调用 getppid()。
    3. 父进程在子进程的睡眠结束之前完成执行并退出。您可以将pause() 函数添加到父进程,使其等待信号处理程序运行。
    4. 如果要打印done,则不能从信号处理程序中调用exit。

    只需修复上述内容即可使程序正常运行,但您也应该考虑修复其他一些问题:

    1. 由于您没有使用 argv[2] 做任何事情,您应该看看 argc 是 2 而不是 3。
    2. 如果没有足够的参数,您应该退出/返回,而不是继续尝试使用没有的参数。
    3. 您应该在"%d second pause" 的末尾添加一个\n 或手动操作fflush,否则您要等到睡觉后才能看到。
    4. printf("Alarm application starting\n", getpid()); 您的格式字符串实际上不会显示 getpid() 的结果。
    5. 如果您确实想退出信号处理程序,则需要使用_Exit,而不是exit,因为后者不是异步信号安全的。

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多