小编Ale*_*tar的帖子

彩色端子输出不会复位

在编写更大的程序时,我偶然发现了彩色文本输出的小问题.这是一个更简单的程序,可以重现这个问题.

#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,虽然其他终端做同样的事情.

我该怎么做才能防止这种情况发生?

c linux terminal stdio

5
推荐指数
1
解决办法
824
查看次数

调用fdopendir()会破坏文件描述符

我偶然发现了我正在制作的一个程序中的一个问题.以下重现我的问题:

#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()在这种情况下,我该怎么做才能防止失败?

c linux

1
推荐指数
1
解决办法
702
查看次数

标签 统计

c ×2

linux ×2

stdio ×1

terminal ×1