usleep 不工作,参数无效错误
usleep not working, invalid argument error
usleep 只是没有等待任何时间,errno 变量指出正在将无效参数传递给函数,即使我使用 useconds_t 类型我也只是一遍又一遍地得到相同的错误。
我不知道这里发生了什么,这是我为一些测试制作的文件。
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main() {
unsigned int delay=500000;
int err=errno;
printf("%d\n", err);
usleep(delay);
err = errno;
printf("%d\n", err);
return 0;
}
strace 输出:
execve("./a.out", ["./a.out"], 0x7fffec458c30 /* 22 vars */) = 0
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffff9f5d4f0) = -1 EINVAL (Invalid argument)
brk(NULL) = 0x1757000
brk(0x17581c0) = 0x17581c0
arch_prctl(ARCH_SET_FS, 0x1757880) = 0
uname({sysname="Linux", nodename="DESKTOP-PRJN4N7", ...}) = 0
readlink("/proc/self/exe", "/mnt/c/Users/User/dmsh/gm/a.out", 4096) = 31
brk(0x17791c0) = 0x17791c0
brk(0x177a000) = 0x177a000
mprotect(0x4bd000, 12288, PROT_READ) = 0
fstat(1, {st_mode=S_IFCHR|0660, st_rdev=makedev(0x4, 0x1), ...}) = 0
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(1, "0\n", 20
) = 2
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=500000000}, NULL) = -1 EINVAL (Invalid argument)
write(1, "22\n", 322
) = 3
exit_group(0) = ?
+++ exited with 0 +++
readlink("/proc/self/exe", "/mnt/c/Users/User/dmsh/gm/a.out", 4096) = 31
该行中的路径表明您正在使用 WSL 运行 您在 Windows 中的程序,而不是直接 Linux 或 Unix 系统。
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=500000000}, NULL) = -1 EINVAL (Invalid argument)
那个告诉我们你在 WSL 中使用 glibc 版本,它根据 clock_nanosleep()
实现 usleep()
(我的 Ubuntu 16.04 WSL 安装使用 nanosleep()
, fwiw。显然 glibc 的人在某些时候改变了 usleep()
实现。)
WSL linux 仿真层不支持带有 CLOCK_REALTIME
计时器的 clock_nanosleep()
。为了验证,这个演示程序:
#include <stdio.h>
#include <string.h>
#include <time.h>
int main(void) {
struct timespec timeout = { .tv_sec = 0, .tv_nsec = 500000000 };
int err;
if ((err = clock_nanosleep(CLOCK_REALTIME, 0, &timeout, NULL)) != 0) {
printf("clock_nanosleep realtime failed: %s\n", strerror(err));
} else {
puts("clock_nanosleep realtime worked.");
}
if ((err = clock_nanosleep(CLOCK_MONOTONIC, 0, &timeout, NULL)) != 0) {
printf("clock_nanosleep monotonic failed: %s\n", strerror(err));
} else {
puts("clock_nanosleep monotonic worked.");
}
if (nanosleep(&timeout, NULL) < 0) {
perror("nanosleep");
} else {
puts("nanosleep worked.");
}
return 0;
}
应该打印出来
clock_nanosleep realtime failed: Invalid argument
clock_nanosleep monotonic worked.
nanosleep worked.
编译时运行它。
解决方法是不使用 usleep()
(无论如何都已弃用,POSIX 中不再使用)。使用单调计时器尝试 nanosleep()
或以上 clock_nanosleep()
。
usleep 只是没有等待任何时间,errno 变量指出正在将无效参数传递给函数,即使我使用 useconds_t 类型我也只是一遍又一遍地得到相同的错误。
我不知道这里发生了什么,这是我为一些测试制作的文件。
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main() {
unsigned int delay=500000;
int err=errno;
printf("%d\n", err);
usleep(delay);
err = errno;
printf("%d\n", err);
return 0;
}
strace 输出:
execve("./a.out", ["./a.out"], 0x7fffec458c30 /* 22 vars */) = 0
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffff9f5d4f0) = -1 EINVAL (Invalid argument)
brk(NULL) = 0x1757000
brk(0x17581c0) = 0x17581c0
arch_prctl(ARCH_SET_FS, 0x1757880) = 0
uname({sysname="Linux", nodename="DESKTOP-PRJN4N7", ...}) = 0
readlink("/proc/self/exe", "/mnt/c/Users/User/dmsh/gm/a.out", 4096) = 31
brk(0x17791c0) = 0x17791c0
brk(0x177a000) = 0x177a000
mprotect(0x4bd000, 12288, PROT_READ) = 0
fstat(1, {st_mode=S_IFCHR|0660, st_rdev=makedev(0x4, 0x1), ...}) = 0
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(1, "0\n", 20
) = 2
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=500000000}, NULL) = -1 EINVAL (Invalid argument)
write(1, "22\n", 322
) = 3
exit_group(0) = ?
+++ exited with 0 +++
readlink("/proc/self/exe", "/mnt/c/Users/User/dmsh/gm/a.out", 4096) = 31
该行中的路径表明您正在使用 WSL 运行 您在 Windows 中的程序,而不是直接 Linux 或 Unix 系统。
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=500000000}, NULL) = -1 EINVAL (Invalid argument)
那个告诉我们你在 WSL 中使用 glibc 版本,它根据 clock_nanosleep()
实现 usleep()
(我的 Ubuntu 16.04 WSL 安装使用 nanosleep()
, fwiw。显然 glibc 的人在某些时候改变了 usleep()
实现。)
WSL linux 仿真层不支持带有 CLOCK_REALTIME
计时器的 clock_nanosleep()
。为了验证,这个演示程序:
#include <stdio.h>
#include <string.h>
#include <time.h>
int main(void) {
struct timespec timeout = { .tv_sec = 0, .tv_nsec = 500000000 };
int err;
if ((err = clock_nanosleep(CLOCK_REALTIME, 0, &timeout, NULL)) != 0) {
printf("clock_nanosleep realtime failed: %s\n", strerror(err));
} else {
puts("clock_nanosleep realtime worked.");
}
if ((err = clock_nanosleep(CLOCK_MONOTONIC, 0, &timeout, NULL)) != 0) {
printf("clock_nanosleep monotonic failed: %s\n", strerror(err));
} else {
puts("clock_nanosleep monotonic worked.");
}
if (nanosleep(&timeout, NULL) < 0) {
perror("nanosleep");
} else {
puts("nanosleep worked.");
}
return 0;
}
应该打印出来
clock_nanosleep realtime failed: Invalid argument
clock_nanosleep monotonic worked.
nanosleep worked.
编译时运行它。
解决方法是不使用 usleep()
(无论如何都已弃用,POSIX 中不再使用)。使用单调计时器尝试 nanosleep()
或以上 clock_nanosleep()
。