Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当缓冲区为1MB时,对系统的调用(“printf buffer>;output.txt”)无法写入文件_C - Fatal编程技术网

C 当缓冲区为1MB时,对系统的调用(“printf buffer>;output.txt”)无法写入文件

C 当缓冲区为1MB时,对系统的调用(“printf buffer>;output.txt”)无法写入文件,c,C,我试图调用系统将缓冲区保存到输出,我必须使用系统调用或Exeve和管道(这是一个大学项目) 为文件的一部分读取缓冲区,然后我必须对其运行sh,然后才能将其保存到文件中。 我试图用system()将其保存到文件中,当我用一个较短的字符串替换缓冲区时,它可以很好地工作,但不能使用较大的缓冲区 我使用此函数创建命令: char* command = string_new(); string_append_with_format(&command, "(printf '%s') > %s"

我试图调用系统将缓冲区保存到输出,我必须使用系统调用或Exeve和管道(这是一个大学项目)

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

我使用此函数创建命令:

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
函数的功能。