从FIFO传送到其他行的字符串

时间:2018-08-09 21:35:22

标签: c++ string c++11 fifo

我的代码从fifo读取行,构造函子,并将其与Boost线程池排队。我遇到偶尔的工作项失败的问题,但是当我添加日志记录时,问题就消失了。

我已经将其工作到std::ofstream打开的位置,但是我不知道为什么这是真的。通过移动这条线,我能够使问题再次发生。有时,某行的一部分丢失并重新出现在其他位置(已添加到另一行或覆盖了另一行)。这似乎不是随机的。如果输入相同,则错误总是发生在同一位置,但是如果重新排列输入行,则错误将发生在不同的位置。

例如

    # This line should read
    # /dev/shm/test/bluetooth-active-symbolic.symbolic.png.csv.plot.png
    # But it is missing the leading "/dev/"
shm/test/bluetooth-active-symbolic.symbolic.png.csv.plot.png
    # This line should read
    # POOLCMD_CLOSE
    # But the missing text reappeared here
/dev/POOLCMD_CLOSE

代码

我们在哪里分支到背景

switch (fork()) {
    case -1:
        std::cerr << "Error forking\n";
        return 1;
    case 0:
        close(0);
        close(1);
        close(2);
        dup2(stdout_file, fileno(stdout));
        dup2(stdout_file, fileno(stderr));
        setsid();
        went_background = true;
// If this ofstream line is moved elsewhere, things break
        log_file = std::ofstream("poolcmd-log.txt");
        break;
    default:
        exit(0);
}

我们从fifo那里读到

read_threads.push_back(
    decltype(read_threads)::value_type(new std::thread([&]() {
        char* line = 0;
        size_t n = 0;
        while (true) {
            auto read = getline(&line, &n, fifo);
            locked_print(log_file, "read: ");
            locked_print(log_file, line);
            if (read >= 0) {
                std::string tmp(line, read - 1);
                if (tmp == "POOLCMD_CLOSE") {
                    locked_print(log_file, "Understood POOLCMD_CLOSE\n");
                    break;
                }

                tp.add(Executer(cmd, {tmp}, quiet));
            }
            else {
                locked_print(log_file, "read < 0\n");
                break;
            }
        }

        free(line);
        fclose(fifo);
        remove(fifo_name.c_str());
    })));

0 个答案:

没有答案