c - printf()在调用sleep()后不在pthread中打印



sleep()在我的c项目中运行petalinux超过2秒是错误的。代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
printf("Main sleepn");
sleep(3);
printf("Main wakeupn");
fflush(stdout);
exit(0);
}

休眠3秒,我没有看到唤醒打印语句,也没有程序退出。我必须按一次或两次回车键,然后程序退出,没有打印唤醒。如果我睡了2秒,那么程序就会按预期运行。

只能在运行petalinux的主板上重现。在我的笔记本电脑上编译和运行的相同代码没有这种奇怪的行为

我通过串行控制台连接到zedboard。控制台在主板上运行的串行设备是默认的/dev/ttyps0

编辑:改变问题,与多线程无关。添加了最简单的可复制示例

编辑:我添加了以下

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
int main(){
time_t t = time(NULL);
struct tm tme = *localtime(&t);
printf("Main sleep at %d secondsn", tme.tm_sec);
sleep(3);
t = time(NULL);
tme = *localtime(&t);
printf("Main wakeup at %d secondsn", tme.tm_sec);
fflush(stdout);
exit(0);
}

我这样运行程序:

root@zed:~# ./payload-software > a.txt

程序直到我按回车键才退出,我等了20秒。我输入这个文件,结果如下:

root@zed:~# cat a.txt 
Main sleep at 35 seconds
Main wakeup at 38 seconds

程序像它应该的那样睡觉,但它没有退出,当我运行它没有文件重定向时,它没有打印到stdout。如果我把睡眠时间改为2秒,它可以正常工作。

编辑:添加空格:

root@zed:~# strace payload-software
execve("/usr/bin/payload-software", ["payload-software"], 0xbe9f8dd0 /* 13 vars */) = 0
brk(NULL)                               = 0x4dd000
uname({sysname="Linux", nodename="zed", ...}) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=6146, ...}) = 0
mmap2(NULL, 6146, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6f98000
close(3)                                = 0
openat(AT_FDCWD, "/lib/librt.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "177ELF1113(1@33004"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=22176, ...}) = 0
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f96000
mmap2(NULL, 86248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f5a000
mprotect(0xb6f5f000, 61440, PROT_NONE)  = 0
mmap2(0xb6f6e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0xb6f6e000
close(3)                                = 0
openat(AT_FDCWD, "/lib/libpthread.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "177ELF1113(1]V004"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=75704, ...}) = 0
mmap2(NULL, 147656, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f35000
mprotect(0xb6f47000, 61440, PROT_NONE)  = 0
mmap2(0xb6f56000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x11000) = 0xb6f56000
mmap2(0xb6f58000, 4296, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f58000
close(3)                                = 0
openat(AT_FDCWD, "/lib/tls/v7l/neon/vfp/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l/neon/vfp", 0xbeab1178) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/v7l/neon/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l/neon", 0xbeab1178) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/v7l/vfp/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l/vfp", 0xbeab1178)  = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/v7l/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l", 0xbeab1178)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/neon/vfp/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/neon/vfp", 0xbeab1178) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/neon/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/neon", 0xbeab1178)     = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/vfp/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/vfp", 0xbeab1178)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls", 0xbeab1178)          = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/v7l/neon/vfp/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l/neon/vfp", 0xbeab1178) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/v7l/neon/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l/neon", 0xbeab1178)     = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/v7l/vfp/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l/vfp", 0xbeab1178)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/v7l/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l", 0xbeab1178)          = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/neon/vfp/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/neon/vfp", 0xbeab1178)     = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/neon/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/neon", 0xbeab1178)         = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/vfp/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/vfp", 0xbeab1178)          = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "177ELF1113(12112601004"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=931444, ...}) = 0
mmap2(NULL, 1001036, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6e40000
mprotect(0xb6f20000, 61440, PROT_NONE)  = 0
mmap2(0xb6f2f000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xdf000) = 0xb6f2f000
mmap2(0xb6f33000, 5708, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f33000
close(3)                                = 0
set_tls(0xb6f973f0)                     = 0
mprotect(0xb6f2f000, 8192, PROT_READ)   = 0
mprotect(0xb6f56000, 4096, PROT_READ)   = 0
mprotect(0xb6f6e000, 4096, PROT_READ)   = 0
mprotect(0x4d4000, 4096, PROT_READ)     = 0
mprotect(0xb6f9a000, 4096, PROT_READ)   = 0
munmap(0xb6f98000, 6146)                = 0
set_tid_address(0xb6f96f18)             = 656
set_robust_list(0xb6f96f20, 12)         = 0
rt_sigaction(SIGRTMIN, {sa_handler=0xb6f3a20d, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0xb6e6a291}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0xb6f3a291, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0xb6e6a291}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
clock_gettime64(CLOCK_REALTIME_COARSE, {tv_sec=1520599284, tv_nsec=439968873}) = 0
brk(NULL)                               = 0x4dd000
brk(0x4fe000)                           = 0x4fe000
openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(0xfd, 0), ...}) = 0
ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
write(1, "Main sleep at 24 secondsn", 25Main sleep at 24 seconds
) = 25
clock_nanosleep_time64(CLOCK_REALTIME, 0, {tv_sec=3, tv_nsec=3761122102560686080},





0xbeab1bd0) = 0
clock_gettime64(CLOCK_REALTIME_COARSE, {tv_sec=1520599287, tv_nsec=449968632}) = 0
openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(1, "Main wakeup at 27 secondsn", 26Main wakeup at 27 seconds
) = 26
exit_group(0)                           = ?
+++ exited with 0 +++

注意,在调用sleep()来打印之后,我必须再次重复按enter键来获得输出。

问题似乎与主板的串行控制台有关。我注意到同样的问题在启动时发生,启动时的某个系统调用阻塞了一点来设置一些东西,这导致随后的启动消息不显示。控制台提示符也不会出现,直到我按下回车键,这与我在运行上述代码时看到的问题完全相同。

所以是串行控制台出了问题。在ssh上,不存在这个问题。我不确定它是在我的端(我使用的是屏幕)还是在zedboard端(它使用的是getty)。

不管怎样,不是世界末日,谢谢大家的帮助。

最新更新