alarm(int) 可以覆盖 C 中的 sleep(int) 吗?
Can alarm(int) override sleep(int) in C?
我为 alarm()
创建了一个 signal handler
。 parent 分叉出另一个没有未决警报信号的进程。因此,警报仅在 parent 进程中调用。
但是当 alarm(2)
被调用时,它会覆盖 parent 过程中的 sleep(10)
。 Parent 打印前只等待 2 秒 :
"parent retval=8"
而 child 等待 10 秒。为什么 alarm()
信号会覆盖 sleep()
并睡眠 return 任何东西(显然在这种情况下它会这样做,但为什么?sleep()
不应该 return 任何东西,对吧?)?
代码如下。
<headers>
pid_t cpid;
int main() {
int retval;
signal(SIGALRM, handler);
alarm(2);
if ((cpid = fork()) == 0) {
printf(“I’m the child\n”);
retval = sleep(10);
printf(“child retval=%d\n”, retval);
}
else {
printf(“I’m the parent\n”);
retval = sleep(10);
printf(“parent retval=%d\n”, retval);
}
}
/* Handle SIGALRM */
void handler(int sig)
{
if (cpid == 0)
printf(“running child handler\n”);
else
printf(“running parent handler\n”);
}
Sleep returns 0 或如果 returns 早点睡觉剩余的秒数。此外,手册页指出混合睡眠和警报不是一个好主意。
NAME
sleep - Sleep for the specified number of seconds
SYNOPSIS
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
DESCRIPTION
sleep() makes the calling process sleep until seconds seconds have elapsed or a signal arrives which is not ignored.
RETURN VALUE
Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler.
CONFORMING TO
POSIX.1-2001.
BUGS
sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and sleep() is a bad idea.
Using longjmp(3) from a signal handler or modifying the handling of SIGALRM while sleeping will cause undefined results.
SEE ALSO
alarm(2), signal(2), signal(7)
Return 睡眠():
0 线程休眠了指定的全部时间。
value 由于信号的作用是 运行 一个 signal-catching 函数、结束请求或终止进程,线程没有完全休眠。返回值为指定休眠时间剩余的秒数;即seconds的值减去线程实际挂起的秒数。
-1 sleep() 没有成功。设置 errno 变量以指示错误。
创建子进程时,Alarm 不会在子进程中继承。
我为 alarm()
创建了一个 signal handler
。 parent 分叉出另一个没有未决警报信号的进程。因此,警报仅在 parent 进程中调用。
但是当 alarm(2)
被调用时,它会覆盖 parent 过程中的 sleep(10)
。 Parent 打印前只等待 2 秒 :
"parent retval=8"
而 child 等待 10 秒。为什么 alarm()
信号会覆盖 sleep()
并睡眠 return 任何东西(显然在这种情况下它会这样做,但为什么?sleep()
不应该 return 任何东西,对吧?)?
代码如下。
<headers>
pid_t cpid;
int main() {
int retval;
signal(SIGALRM, handler);
alarm(2);
if ((cpid = fork()) == 0) {
printf(“I’m the child\n”);
retval = sleep(10);
printf(“child retval=%d\n”, retval);
}
else {
printf(“I’m the parent\n”);
retval = sleep(10);
printf(“parent retval=%d\n”, retval);
}
}
/* Handle SIGALRM */
void handler(int sig)
{
if (cpid == 0)
printf(“running child handler\n”);
else
printf(“running parent handler\n”);
}
Sleep returns 0 或如果 returns 早点睡觉剩余的秒数。此外,手册页指出混合睡眠和警报不是一个好主意。
NAME
sleep - Sleep for the specified number of seconds
SYNOPSIS
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
DESCRIPTION
sleep() makes the calling process sleep until seconds seconds have elapsed or a signal arrives which is not ignored.
RETURN VALUE
Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler.
CONFORMING TO
POSIX.1-2001.
BUGS
sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and sleep() is a bad idea.
Using longjmp(3) from a signal handler or modifying the handling of SIGALRM while sleeping will cause undefined results.
SEE ALSO
alarm(2), signal(2), signal(7)
Return 睡眠():
0 线程休眠了指定的全部时间。
value 由于信号的作用是 运行 一个 signal-catching 函数、结束请求或终止进程,线程没有完全休眠。返回值为指定休眠时间剩余的秒数;即seconds的值减去线程实际挂起的秒数。
-1 sleep() 没有成功。设置 errno 变量以指示错误。
创建子进程时,Alarm 不会在子进程中继承。