在编写更大的程序时,我偶然发现了彩色文本输出的小问题.这是一个更简单的程序,可以重现这个问题.
#include <stdio.h>
#define COL_RESET "\033[0m"
#define COL_BG_RED "\x1B[41m"
char *str = "the quick brown fox jumped over the lazy dog";
int main(int argc, char *argv[])
{
int i = 10;
while (i) {
puts(COL_BG_RED);
puts(str);
puts(COL_RESET);
puts(str);
i--;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在这是我运行程序时得到的:
第一次 - 预期的结果

第二次

如您所知,即使重置红色后,程序也会决定随机打印行.在新终端中启动时,它始终打印预期结果.除非我跑clear,否则无法保证输出不会像第二张图片那样受损.
在我正在使用的图片中xterm,虽然其他终端做同样的事情.
我该怎么做才能防止这种情况发生?
我偶然发现了我正在制作的一个程序中的一个问题.以下重现我的问题:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
int fd, ret_fd;
DIR *dirp;
fd = open("./", O_RDONLY);
#if 1
if ((dirp = fdopendir(fd)) == NULL) {
perror("dirp");
return 1;
}
closedir(dirp);
#endif
ret_fd = openat(fd, "Makefile", O_RDONLY);
if (ret_fd == -1) {
perror("ret_fd");
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
基本上,openat()先前的呼叫fdopendir()失败了:Bad file descriptor.但是,如果fdopendir()省略,则不会发生这种情况.
我知道fdopendir()内部使用文件描述符,但是在调用后不应该还原它的任何更改closedir()?
openat()在这种情况下,我该怎么做才能防止失败?