【问题标题】:C program to test other programs with repeatable input and no restart用可重复输入且无需重新启动的 C 程序来测试其他程序
【发布时间】:2018-03-27 04:19:26
【问题描述】:

我正在尝试编写一个 C 程序,该程序能够通过传入输入和测试输出来测试其他程序的性能,而无需在每次运行时重新启动程序。我和同事正在编写数独求解器,我正在编写程序来通过解决许多谜题来测试每个程序的运行速度,这些谜题可能都是不同的语言,我不想因为使用语言而惩罚人们,像Java一样,启动起来真的很慢。理想情况下,该程序将启动数独求解程序,使其保持运行,并不断通过stdin 传递一个新的谜题,并在stdout 中测试输出。

这是我想做的伪代码:

start a sudoku solver in another process
once process is running
    pass puzzle string into child stdin
    wait until output comes into stdout
    repeat until end time limit ends
close process

我搞砸了popen,但我不知道如何写入子进程stdin。我在网上查了很多,还是没弄明白。

关于如何完成此任务的任何建议?我在 Linux 机器上运行它。不必一定是stdinstdout 进行交流,但这对其他人来说是最简单的。

【问题讨论】:

  • 你需要花几周时间阅读更多关于 Unix 编程的知识,例如ALP 或一些新书。您基本上想了解 shell 的工作原理。大多数unix shells 或批处理处理器是free software,因此请研究它们的源代码。但是你的问题太宽泛了。
  • 您还需要定义常见的约定和协议。还要查看batch 命令。
  • 请注意,必须编写数独求解器以便它们循环,在有更多输入时解决问题。如果它们是为解决一个问题而编写的,那么除了重新启动它们之外,您无法明智地解决第二个问题。
  • @technosaurus 和 popen 你只会得到一个单向管道。

标签: c linux performance process sudoku


【解决方案1】:

这更像是一个长评论而不是一个答案,但你的问题实在是太宽泛和不明确,我只是给出一些提示。

您首先需要了解如何启动、管理和与子进程通信。 需要一本完整的 Unix 编程书来解释这一点。你可以阅读ALP 或一些更新的书。您需要能够编写类似Unix shell 的程序。熟悉许多syscalls(2),包括fork(2)pipe(2)execve(2)dup2(2)poll(2)waitpid(2) 和其他十几个。另见signal(7) & time(7)

您还需要与您的同事讨论一些关于这些数独程序的约定协议以及您的控制程序将如何与它们通信(邪恶在细节中)。例如,您的伪代码提到了“传递拼图字符串”,但您没有定义它的确切含义(如果字符串包含换行符或奇怪的字符怎么办?)。另请阅读inter-process communication

(您可能希望运行多个数独进程。您可能不希望有错误的数独客户端破坏您的控制程序。这在您的问题中不清楚)

您可能想要定义一个text-based protocol(它们比binary protocols 更易于调试和使用)。细节很重要,所以要准确记录(可能使用一些EBNF 符号)。您可能希望使用 JSONYAMLS-expressions 等文本格式。您可以从SMTPHTTPJSONRPC 等(或者选择使用其中之一)中获得灵感。

请记住,pipe(7)-s、fifo(7)-s 和 tcp(7)-s socket(7)-s 只是一个字节流,没有任何消息边界。任何高于这些的消息组织都应该是一个记录约定(并且消息可能会被分割,所以你需要小心缓冲)。另见this

(我建议为您的协议制作一些免费软件示例实现)

也可以看看类似的作品,也许是SAT competition(或者国际象棋比赛节目,我不知道细节)。

还可以阅读有关操作系统的信息,例如 Operating Systems: Three Easy Pieces

【讨论】:

  • 很好的答案。不过,我会说,我不需要一本完整的 Unix 编程书来完成这项工作(我正在使用我的 Hearts AI 进行测试)。一些关于命名管道的谷歌搜索得到了我需要的东西,但我已经知道消息边界并且以前使用过 TCP 套接字。
  • 不,这还不够。你至少需要知道ALP 的一半,这太长了,无法回答。特别是,您需要了解为什么需要poll(2),这需要几章的解释。我关于管道只是字节流的最后一段很重要。 OP 可能没有意识到“消息边界”的事情
  • @BasileStarynkevitch poll 如果父母和孩子在仔细传递大小信息时就输入/输出约定达成一致,则可能不需要。
  • 这取决于 OP 真正想要什么。他的问题太笼统了,我们只能猜测
  • 如果 OP 想要处理有问题的数独客户端的情况(例如,在输出垃圾或等待输入时无限循环),他可能需要 poll
猜你喜欢
  • 1970-01-01
  • 2021-03-01
  • 2021-07-02
  • 2011-08-10
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
相关资源
最近更新 更多