测试linux程序打印输出重定向buffer大小

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试linux程序打印输出重定向buffer大小相关的知识,希望对你有一定的参考价值。

程序打印输出重定向到文件时,有buffer限制,比如之前在海康那个系统下,是4096字节,只有攒满这么多字节,才会往文件输出一次

现在我们测试在ubuntu20.04下,这个数值是多少

文章目录

问:帮我写一个linux c++程序,这个程序会将所有输出重定向到一个.log文件,同时程序中有一个while循环,当检测到这个.log文件大小变化时,打印这个.log文件的大小(好像不对,我需求搞错了)

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

using namespace std;

// 将标准输出重定向到指定的文件
void ky_redirect_output(const char *filePath)

    int fd = 0;
    // 以追加的方式打开文件
    fd = open(filePath, O_CREAT | O_RDWR | O_APPEND, 0777);
    if (fd == -1)
    
        return;
    

    // 重定向标准输出到文件
    dup2(fd, STDOUT_FILENO);
    close(fd);


int main()

    // 重定向标准输出到test.log文件
    ky_redirect_output("test.log");

    int oldSize = 0;
    while (true)
    
        // 获取文件大小
        struct stat st;
        if (stat("test.log", &st) == 0)
        
            int newSize = st.st_size;
            // 如果文件大小改变,则打印文件大小
            if (newSize != oldSize)
            
                cout << "file size is: " << newSize << endl;
                oldSize = newSize;
            
        

        // 每隔1秒检测一次
        sleep(1);
    

    return 0;

问:帮我写一个linux c++程序,这个程序会每毫秒打印1字节长度的信息,同时程序中有一个while循环,每毫秒会检测一个.log文件的大小,如果这个.log文件大小发生变化时,打印这个.log文件的大小。程序的输出不要重定向到.log文件。

(print)

#include <iostream>
#include <fstream>
#include <chrono>
//#include <thread>
#include <unistd.h>

int main()

    while (true)
    
        //std::cout << "Print 1 byte info every millisecond." << std::endl;
        std::cout << "b" << std::endl;
        usleep(1000);
        //std::this_thread::sleep_for(std::chrono::milliseconds(1));
    
    return 0;


(check)

#include <iostream>
#include <fstream>
#include <chrono>
#include <thread>

int main()

    std::string logFileName = ".log";
    std::ifstream logFile(logFileName.c_str(), std::ios::binary);

    unsigned long long lastSize = 0;
    while (true)
    
        unsigned long long currentSize = 0;
        logFile.seekg(0, logFile.end);
        currentSize = logFile.tellg();
        if (lastSize != currentSize)
        
            std::cout << "Log file size changed to: " << currentSize << std::endl;
            lastSize = currentSize;
        
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    
    return 0;

编译:

g++ print.cpp -o print
g++ check.cpp -o check
./print > .log 2>&1 &
./check

然后发现每两字节就会打印一下…估计是把\\n也计算进去了


.log


这跟CH的python程序不符啊,,他的那个要结束才输出到文件中,不知道怎么回事

以上是关于测试linux程序打印输出重定向buffer大小的主要内容,如果未能解决你的问题,请参考以下文章

[Linux应用]Linux应用程序输出数据重定向到文件中

[Linux 005]——IO重定向

Linux 输出重定向 “>”“>>”“freopen”

Linux进阶第五天

Linux - Linux中的重定向和管道符

将程序输出重定向到文件和shell [重复]