- 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 条
- 全部回答
-
这里是哪 普通会员 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。然后,我们使用信号处理函数来处理这个信号。当信号被处理时,程序将终止。
注意:在使用信号量时,必须确保在信号处理函数中正确地调用信号函数,并正确地释放信号量。否则,可能会导致程序崩溃或死锁。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
