当缓冲区为1MB时,调用系统(" printf buffer> output.txt")无法写入文件

时间:2017-12-06 16:37:50

标签: c

我试图调用系统将缓冲区保存到输出中,我必须使用系统调用,或者使用execve和pipe(它是一个大学项目)。

读取缓冲区的一部分文件,然后我必须运行它,然后我可以将它保存到文件。 我试图用system()将它保存到文件中,当我用较短的字符串替换缓冲区时,它可以很好地工作,但不能使用大缓冲区。

我使用此函数创建命令:

char* command = string_new();
string_append_with_format(&command, "(printf '%s') > %s", buffer, outputName);

以下是iam使用的功能的链接,如果你想看到它们,它是一个大学图书馆。 https://github.com/sisoputnfrba/so-commons-library/blob/master/src/commons/string.c

在sh?

上使用printf命令输出的字符是否有限制

你建议我做什么?改变这种方式来实施方法吗?

谢谢,如果您需要,我会添加代码/信息。

1 个答案:

答案 0 :(得分:3)

  

你建议我做什么?改变这种方式来实施方法吗?

system() vs 的替代方案。 execve()是如何运行另一个进程的选择。后者将与fork()结合使用。鉴于您必须使用其中之一,显然您应该使用外部命令来执行最终目标的I / O.那么,要回答的一个基本问题是 要使用的外部命令。

正如您所发现的,shell命令的大小有限制,如果您直接转换为使用execve()而不是system(),那么您可能会发现存在相应的限制在那个级别。因此,如果数据的可能大小没有适当限制,那么将要打印的数据作为参数传递给命令的基本方法是不可行的。因此,第二个相关的基本问题是如何将要写入的数据传达给外部命令。

请允许我建议使用cat命令代替printf。没有参数,cat只是将其标准输入复制到其标准输出。这解决了提供写入文件的数据的问题:您将安排cat从其标准输入中读取它。要安排数据转到目标文件,您需要将cat的标准输出连接到该文件。

就标准输入而言,看起来您希望在主进程与其pipe() ed子进程之间建立fork(),并向dup2()读取结束管道到孩子的标准输入。孩子将关闭管道的写入端(重要),父母将关闭读取端。

处理输出的干净方式是让孩子到open()目标文件,并将dup2()文件描述符放到其标准输出上。

执行了这些重定向后,孩子将execve() /usr/bin/cat没有参数,父母将write()fwrite()数据写入管道的写入端,然后close()管道和wait() s让孩子完成。