C 当缓冲区为1MB时,对系统的调用(“printf buffer>;output.txt”)无法写入文件
我试图调用系统将缓冲区保存到输出,我必须使用系统调用或Exeve和管道(这是一个大学项目) 为文件的一部分读取缓冲区,然后我必须对其运行sh,然后才能将其保存到文件中。 我试图用system()将其保存到文件中,当我用一个较短的字符串替换缓冲区时,它可以很好地工作,但不能使用较大的缓冲区 我使用此函数创建命令:C 当缓冲区为1MB时,对系统的调用(“printf buffer>;output.txt”)无法写入文件,c,C,我试图调用系统将缓冲区保存到输出,我必须使用系统调用或Exeve和管道(这是一个大学项目) 为文件的一部分读取缓冲区,然后我必须对其运行sh,然后才能将其保存到文件中。 我试图用system()将其保存到文件中,当我用一个较短的字符串替换缓冲区时,它可以很好地工作,但不能使用较大的缓冲区 我使用此函数创建命令: char* command = string_new(); string_append_with_format(&command, "(printf '%s') > %s"
char* command = string_new();
string_append_with_format(&command, "(printf '%s') > %s", buffer, outputName);
这是我使用的函数的链接,如果你想看的话,这是一个大学图书馆。
在sh上使用printf命令可以输出的字符是否有限制
你建议我做什么?要将此更改为Exeve方法
谢谢,如果您需要,我将添加代码/信息
你建议我做什么?要将此更改为Exeve方法
system()
与execve()
的替代方案是如何运行另一个进程的选择。后者将与fork()
结合使用。考虑到您必须使用其中一个命令,显然您应该使用一个外部命令来执行对最终目标的I/O。那么,需要回答的一个基本问题是使用哪个外部命令
正如您所发现的,shell命令的大小有限制,如果您直接转换为使用execve()
而不是system()
,那么您可能会发现在该级别上有相应的限制。因此,如果数据的可能大小没有适当限制,那么将要打印的数据作为参数传递给命令的基本方法是不可行的。因此,第二个相关的基本问题是如何将要写入的数据传输到外部命令
请允许我建议使用cat
命令代替printf
。没有参数,cat
只是将其标准输入复制到其标准输出。这解决了向文件写入数据的问题:您将安排cat
从其标准输入读取数据。要安排数据进入目标文件,您需要将cat
的标准输出连接到该文件
就标准输入而言,您似乎希望在主进程与其fork()
ed子进程之间建立一个管道()
,并将管道的读取端连接到子进程的标准输入上。子级将关闭管道的写入端(重要),父级将关闭读取端
处理输出的干净方法是让子对象open()
目标文件,并dup2()
将其文件描述符添加到其标准输出
执行这些重定向后,子级将
execve()
/usr/bin/cat
不带任何参数,父级将write()
或fwrite()
将数据写入管道的写入端,然后关闭()
管道并等待()
s供孩子完成。是的,命令行的最大长度可能会受到限制,这取决于OSSee和您的操作系统。这是一种非常奇怪的将数据写入文件的方式。您不仅会遇到命令行长度限制,而且如果数据包含特殊字符,例如,
,string\u append\u with_format(&command…),
应该是string\u append\u with_format(命令…
这意味着并非所有警告都已启用。节省时间-启用它们。根据您的选择,我建议设置对“cat>output.txt”的系统调用您可以使用popen
函数执行系统调用并一次性创建管道,或者在自己的代码中模拟popen
函数的功能。