- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个包装器,它 fork 一个 execv()
进程。子项的输出在 stderr
中捕获。当 waitpid()
释放时,我可以读取 stderr
的内容并报告回来。
在我的例子中,我想动态分配一个缓冲区并将 stderr
写入此缓冲区。
为了调整缓冲区的大小,我可以使用 realloc()
,但这不是很有效,而且我发现它往往会膨胀内存池的使用。相反,我想知道大小而不改变它的指针。
考虑以下内容,并注意 MyStderr
只是 stderr
的占位符:
int size=0;
int ch=0;
// int MyStderr is the stderr fd
FILE *nCountFD = fdopen(MyStderr, "r");
while ((ch = getc(nCountFD)!=EOF)
{
++size;
}
printf("Size is %ld\n", size);
在这里我得到了尺寸。但是,现在 MyStderr
的文件指针位于其缓冲区的末尾。
我尝试使用 lseek
。
lseek()
对 stderr
失败,所以我不能在这里使用它。至少,这是我的测试和 stackoverflow 搜索所表明的。
所以...
MyStderr
移动到 eof 的情况下获取大小?或
lseek
方法可以与 MyStderr
一起使用?注意。这是我能想到的唯一解决方案,使用 realloc
..
char *buf=(char*)malloc(80);
char *NewBuf=NULL;
int n=80;
while ((ch = getc(nCountFD)!=EOF)
{
buf[i]=ch;
++size;
if (size>n)
{
n=n+80;
NewBuf= realloc(buf, n);
// some code to make sure it works here //
buf=NewBuf;
}
}
printf("Size is %ld\n", size);
我决定让我的结果缓冲区的初始 malloc 足够大,以便在大多数情况下不太可能使用 realloc(),而不是构建功能来解决 stderr 是无缓冲的这一事实。如果发生 realloc(),则按照建议,每个 realloc() 的原始分配大小都会加倍。
在测试(100000 次迭代)中,这非常有效,没有泄漏或明显的膨胀。
我非常感谢 Stack Overflow 社区。谢谢大家。
下面的代码不会独立运行。它放在这里是为了说明我做了什么。
..在解析命令行、 fork 、执行 execv 和清理的所有代码之后...
while (waitpid(nPID, &status, 0) != nPID)
;
i = 0;
nFD = fdopen(nErrFD, "r");
if (!nFD) {
snprintf(cErrMsg, 80, "Cannot open fd[%i]. Failed to spaw process",
nErrFD);
cbuf = strcpy(cbuf, cErrMsg);
goto NECerror;
}
close(nErrFD);
cbuf = calloc(nBufSz, sizeof(char));
memset(cbuf, 0x00, nBufSz);
i = 0;
while ((ch = getc(nFD)) != EOF) {
cbuf[i] = (char) ch;
++size;
++i;
if (size > nBufSz) {
nBufSz = nBufSz + nBaseBufSz;
NewBuf = realloc(cbuf, nBufSz);
if (NewBuf == NULL) {
snprintf(cErrMsg, 80,
"Internal error:cannot allocate [%i] bytes", nBufSz);
cbuf = strcpy(cbuf, cErrMsg);
fclose(nFD);
goto NECerror;
}
cbuf = NewBuf;
free(NewBuf);
}
}
fclose(nFD);
最佳答案
管道是不可搜索的——如果您正在从另一个进程提供的管道中读取数据,那么您将无法搜索其数据流。您必须在读取时存储数据。
您可能会看到大量内存抖动的原因是您扩展缓冲区的方式——每次超出缓冲区时,您只能将其扩展一个常数。如果在超过时加倍它的大小,您将获得更好的成功:这是dynamic arrays 的众所周知的技术。 .
例如:
// Error checking omitted for expository purposes
size_t size = 4096;
char *buf = malloc(size);
char *bufPtr = buf;
ssize_t n;
while((n = read(MyStderr, bufPtr, 4096) > 0)
{
bufPtr += n;
// Make sure we always have at least 4096 bytes of free space in the
// buffer for the next read
if(size - (bufPtr - buf) < 4096)
{
size *= 2; // Watch out for overflow!
buf = realloc(buf, size);
}
}
// The (bufPtr - buf) bytes of buf now hold the entirety of the process's stderr
关于c - 移动 stderr fd 指针开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197443/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
指针, C语言的精髓 莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA). 什么是指针 保存变量地址的变量叫做指针. 这是大概的定义, 但是Defad认为
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我是一名优秀的程序员,十分优秀!