我正在执行ls程序。除了错误消息和正常输出的同步之外,一切都正常工作。 我将信息存储在大缓冲区(200kb)中。 如您所见,subfolder2无权打开。 我的程序递归工作并打开文件夹测试,然后读取所有内容,然后将其写入stdout。然后打开文件夹,显示所有内容。与subfolder1相同。当它遇到子文件夹2时,将得到errno并在stderr中编写说明。它可以在调试器中运行,而实际上不能运行,因为它将输出放在所需的位置,而不是最后。 就像在底部的示例中一样,它在使用stdout时效果很好。
/Users/qhetting/ft_ls/tests
total 0
drwxr-xr-x 3 qhetting 2018 102 Mar 30 14:08 .
drwxr-xr-x 19 qhetting 2018 646 Mar 30 15:04 ..
drwxr-xr-x 4 qhetting 2018 136 Mar 30 14:10 folder
/Users/qhetting/ft_ls/tests/folder
total 0
drwxr-xr-x 4 qhetting 2018 136 Mar 30 14:10 .
drwxr-xr-x 3 qhetting 2018 102 Mar 30 14:08 ..
drwxrwxrwx 2 qhetting 2018 68 Mar 30 14:09 subfolder1
d--------- 2 qhetting 2018 68 Mar 30 14:10 subfolder2
/Users/qhetting/ft_ls/tests/folder/subfolder1
total 0
drwxrwxrwx 2 qhetting 2018 68 Mar 30 14:09 .
drwxr-xr-x 4 qhetting 2018 136 Mar 30 14:10 ..
ft_ls: subfolder2: Permission denied
代码:
if (!(dir = opendir(fld_name)))
{
if (errno)
print_error(fld_name, errno, NULL); //gets file name, concatenates it with error message and prints it with write like
write(2, error, strlen(error));
return;
}
errno = 0;
while ((dirp = readdir(dir)))
{
if (!(g_flag & A && dirp->d_name[0] != '.') || g_flag & A)
{
attrib = ft_relink(attrib, dirp->d_name,
get_full_path(fld_name, dirp->d_name));
if (first_asign)
{
holder = attrib;
first_asign = false;
}
}
if (errno)
{
print_error(fld_name, errno, attrib);
errno = 0;
continue;
}
}
attrib = holder;
ft_merge_sort(&attrib, comparator_lex);
print_level(attrib, g_flag); //here all read content is printed in stdout with big buffer.
if (g_flag & R_BIG)
{
while (attrib)
{
if (IS_OK && is_dir(attrib->full_path) && !attrib->error_message)
ft_open_folder(attrib->full_path);
attrib = attrib->next;
}
}
closedir(dir);
答案 0 :(得分:1)
您可以使用fflush(stdout)
和fflush(stderr)
刷新输出缓冲区。这样做将立即打印缓冲区中剩余的内容。
简介
int fflush(FILE *stream);
说明
如果流指向未输入最新操作的输出流或更新流,则fflush函数会使该流的所有未写入数据都传递到主机环境中,并写入文件中;否则,行为是不确定的。