我试图调用系统将缓冲区保存到输出中,我必须使用系统调用,或者使用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命令输出的字符是否有限制你建议我做什么?改变这种方式来实施方法吗?
谢谢,如果您需要,我会添加代码/信息。
答案 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让孩子完成。