账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于c语言捕获信号的问题。
    25
    0

    this is my code

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/wait.h>
    #include<signal.h>
    #include<unistd.h>
    
    void handler1(int sig) {
        int pid;
        if ((pid = waitpid(-1, NULL, 0)) < 0)
            printf("waitpid error");
        printf("Handler reaped child %d\n", pid);
        sleep(1);
    }
    
    int main() {
        int i, n;
    
        if (signal(SIGCHLD, handler1) == SIG_ERR) {
            printf("signal error\n");
        }
    
        for (i = 0; i < 3; ++i) {
            if (fork() == 0) {
                printf("Hello from child %d\n", getpid());
                exit(0);
            }
        }
    //    sleep(1);
        printf("Father love you!\n");
        while (1);
        exit(0);
    }

    When I run it, it shows this :

    Father love you!
    Hello from child 7843
    Hello from child 7844
    Hello from child 7842
    Handler reaped child 7842

    But I think it should be

    Father love you!
    Hello from child 7843
    Hello from child 7844
    Hello from child 7842
    Handler reaped child 7842
    Handler reaped child 7843      

    There a repetition of Handler reaped child xx.

    If I uncomment sleep(1);, it will show what i want :

    Hello from child 7858
    Handler reaped child 7858
    Hello from child 7859
    Hello from child 7860
    Handler reaped child 7859
    Father love you!

    I dont know why the first one has only one Handler reaped child. Please help me, thank you in advence.

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 这里是哪 普通会员 1楼

      在C语言中,信号是一种无符号整数,用于表示程序运行过程中的状态变化。信号是由进程自身或用户应用程序发出的,可以用来控制程序的流程。

      C语言提供了一种名为信号量的机制来捕获和处理信号。信号量是一种无符号整数,用于在并发环境中限制进程的并发执行次数。当一个进程要结束时,它会减去对应的信号量值。如果进程执行完成后,信号量值变为0,那么相应的信号就成功地被处理了。

      在C语言中,信号量的使用是通过使用信号函数和信号处理函数来实现的。信号函数用于将信号量值加1,而信号处理函数则用于处理信号。

      以下是一个简单的例子,展示了如何使用信号量来捕获和处理信号:

      ```c

      include

      include

      include

      define MAX嗜血量 10

      void signal_handler(int signum) { printf("A signal has been received.\n"); }

      int main() { int i; int max嗜血量 = MAX嗜血量;

      // 创建一个信号量
      sem_t sem;
      
      // 将信号量值加1
      sem_init(&sem, 0, 1);
      
      // 将信号量值加1
      sem_add(&sem, &max嗜血量, &max嗜血量);
      
      // 信号量值加1
      sem_add(&sem, &max嗜血量, &max嗜血量);
      
      // 执行信号处理函数
      sem_wait(&sem);
      
      // 清除信号量
      sem_destroy(&sem);
      
      return 0;
      

      } ```

      在这个例子中,我们首先创建了一个信号量,并将其值加1。然后,我们使用信号处理函数来处理这个信号。当信号被处理时,程序将终止。

      注意:在使用信号量时,必须确保在信号处理函数中正确地调用信号函数,并正确地释放信号量。否则,可能会导致程序崩溃或死锁。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部