标签: c

用C或Python中的popen绕过子进程输出的缓冲

我有一个关于popen(以及所有相关函数)的一般性问题,适用于所有操作系统,当我编写python脚本或一些c代码并从控制台(win或linux)运行生成的可执行文件时,我可以立即看到输出从过程中.但是,如果我运行与分支进程相同的可执行文件,并将其stdout重定向到管道,则输出缓冲到某处,通常最多为4096字节,然后将其写入父进程可以读取的管道.

以下python脚本将以1024字节的块生成输出

import os, sys, time

if __name__ == "__main__":
     dye = '@'*1024
     for i in range (0,8):
        print dye
        time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

以下python脚本将执行前一个脚本,并在输出到管道时逐字节地读取输出

import os, sys, subprocess, time, thread

if __name__ == "__main__":
    execArgs = ["c:\\python25\\python.exe", "C:\\Scripts\\PythonScratch\\byte_stream.py"]

    p = subprocess.Popen(execArgs, bufsize=0, stdout=subprocess.PIPE)
    while p.returncode == None:
        data = p.stdout.read(1)
        sys.stdout.write(data)
        p.poll()
Run Code Online (Sandbox Code Playgroud)

调整操作系统的路径.在此配置中运行时,尽管popen命令的缓冲区大小设置为0(无论如何都是默认值),但输出不会以1024块显示,而是以4096块显示.任何人都可以告诉我如何改变这种行为吗?有什么方法可以强迫操作系统以与从控制台运行时相同的方式处理分叉进程的输出,即只需通过数据提供数据没有缓冲?

c python buffer pipe

12
推荐指数
1
解决办法
9171
查看次数

解析数字时scanf()和strtol()/ strtod()之间的区别

注意:我完全重写了这个问题,以更恰当地反映出我为此设置的赏金.请原谅与已经给出的答案有任何不一致之处.我不想创建一个新问题,因为之前的答案可能会有所帮助.


我正在努力实现一个C标准库,并对标准的一个特定角落感到困惑.

该标准定义了由接受数字格式scanf函数族(%d,%I,%U,%O,%X)在用于定义而言strtol,strtoul,和strtod.

该标准还规定,fscanf()只会将最多一个字符放回输入流中,因此一些序列可以接受strtol,strtoul并且strtod是不可接受的fscanf(ISO/IEC 9899:1999,脚注251).

我试图找到一些会表现出这种差异的价值观.事实证明,十六进制前缀"0x",后跟不是十六进制数字的字符,就是两个函数系列不同的情况.

有趣的是,很明显没有两个可用的C库似乎在输出上达成一致.(请参阅本问题末尾的测试程序和示例输出.)

我想听到的是解析"0xz"时会被视为符合标准的行为?.理想情况下引用标准中的相关部分来说明问题.

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main()
{
    int i, count, rc;
    unsigned u;
    char * endptr = NULL;
    char culprit[] = "0xz";

    /* File I/O to assert fscanf == sscanf */
    FILE * fh = fopen( "testfile", "w+" );
    fprintf( fh, "%s", culprit );
    rewind( fh );

    /* fscanf …
Run Code Online (Sandbox Code Playgroud)

c standards standards-compliance

12
推荐指数
1
解决办法
4811
查看次数

代码的时间复杂度分析

int foo(int n) 
{
    int x=2;
    while (x<n)
    {
        x = x*x*x;
    }

    return x;
}
Run Code Online (Sandbox Code Playgroud)

我需要分析它的时间复杂性.我注意到它n的速度远远超过了log(n).我的意思是,它做的步骤比做的少O(log(n)).我读了答案,但不知道他们是怎么做到的:确实如此O(log(log(n)).现在,你如何处理这样的问题?

c time-complexity

12
推荐指数
2
解决办法
2061
查看次数

代表C中的动态类型

我正在写一种动态类型的语言.目前,我的对象以这种方式表示:

struct Class { struct Class* class; struct Object* (*get)(struct Object*,struct Object*); };
struct Integer { struct Class* class; int value; };
struct Object { struct Class* class; };
struct String { struct Class* class; size_t length; char* characters; };
Run Code Online (Sandbox Code Playgroud)

目标是我应该能够将所有内容作为a传递struct Object*,然后通过比较class属性来发现对象的类型.例如,要转换一个整数以供使用,我只需执行以下操作(假设它integer是类型struct Class*):

struct Object* foo = bar();

// increment foo
if(foo->class == integer)
    ((struct Integer*)foo)->value++;
else
    handleTypeError();
Run Code Online (Sandbox Code Playgroud)

问题是,据我所知,C标准没有对如何存储结构做出承诺.在我的平台上这是有效的.但是在另一个平台struct String可能存储value之前class和我foo->class在上面访问时我会实际访问foo->value,这显然很糟糕.便携性是这里的一个重要目标.

这种方法有其他选择:

struct …
Run Code Online (Sandbox Code Playgroud)

c data-representation

12
推荐指数
3
解决办法
3189
查看次数

在C/Python中的asn.1解析器

我正在寻找一个解析asn.1规范文件并从中生成解码器的解决方案.

理想情况下,我想使用Python模块,但如果没有可用的话,我会使用C/C++库并将它们与Python接口,并提供大量的解决方案.

在过去,我一直在使用pyasn1并手工构建所有东西,但这已经变得过于笨拙.

我对libtasn1和asn1c看起来也很表面.第一个解析甚至最简单的文件都有问题.第二个有一个很好的解析器但是生成用于解码的C代码似乎太复杂了; 该解决方案适用于简单的规范,但在复杂的规则上窒息.

我可能忽略了其他任何好的选择吗?

c python parsing asn.1

12
推荐指数
2
解决办法
2万
查看次数

如何在C中将char*str复制到char c []?

尝试复制char *strchar c[]但却出现分段错误或初始化程序错误无效.

为什么这段代码给我一个seg错误

char *token = "some random string";
char c[80];  
strcpy( c, token);
strncpy(c, token, sizeof c - 1); 
c[79] = '\0';
char *broken = strtok(c, "#");
Run Code Online (Sandbox Code Playgroud)

c string char

12
推荐指数
1
解决办法
8万
查看次数

在父级恢复执行UNIX之前等待所有子进程

在我的程序中,我在一个有限的while循环中分支(并行)子进程,并在每个进程上执行exec.我希望父进程在所有子进程终止后才恢复执行(此while循环后的点).我该怎么办?

我尝试了几种方法.在一种方法中,我在while循环之后使父进行暂停,并且仅当waitpid返回错误ECHILD(没有剩余子进程)时才从SIGCHLD处理程序发送一些条件但是我在这种方法中遇到的问题甚至在父进程完成所有进程之前,retStat变为-1

    void sigchld_handler(int signo) {
        pid_t pid;
        while((pid= waitpid(-1,NULL,WNOHANG)) > 0);
        if(errno == ECHILD) {
            retStat = -1;
        }
    }

    **//parent process code**
    retStat = 1;
    while(some condition) {
       do fork(and exec);
    }

    while(retStat > 0)
        pause();
//This is the point where I want execution to resumed only when all children have finished
Run Code Online (Sandbox Code Playgroud)

c unix fork

12
推荐指数
1
解决办法
4万
查看次数

我在哪里可以找到C中的Lisp阅读器?

我有一个用Java编写的Lisp读者,我正在考虑将其翻译成C.(或者也许是C++.)这是一个相当完整和有用的黑客,因此主要问题是在没有垃圾收集的语言中进行动态存储分配.如果有人已经想到这一点,我宁可借用他们的代码而不是自己弄明白.(C不是我最喜欢的语言.)

当然,拥有一个Lisp读者是没有意义的,除非你打算用你所读的东西做一些事情,所以也许我应该说出一个问题,我在哪里找到一个用C语言编写的简单Lisp核心,但根据我的经验编写Lisp(最令人惊讶的是)中最难以避免的部分是读者.另外,我不想要垃圾收集器; 我期待一个应用程序,其中列表结构将或多或少地手动释放.

c lisp

12
推荐指数
1
解决办法
1602
查看次数

如何从C调用MATLAB代码?

我有一些代码在MATLAB中绘制三角形.

我需要能够以某种方式从我的C程序执行此代码,生成这些点.

那可能吗?怎么做到呢?

只是一个想法: 我可以以某种方式在C语言中嵌入MATLAB代码,以便它可以在C编译器上编译吗?

c matlab matlab-deployment

12
推荐指数
2
解决办法
1万
查看次数

找出是否已通过tcp发送消息

当我通过tcp流发送()/ write()消息时,如何确定这些字节是否成功传递?

接收器确认通过tcp接收字节,因此发送器tcp堆栈应该知道.

但是当我发送()一些字节时,send()立即返回,即使数据包无法(尚未)传递,我在linux 2.6.30上使用strace在netcat上测试,在发送一些字节之前拉出我的网线.

我只是在开发一个应用程序,其中非常重要的是知道是否已传递消息,但实现tcp功能("ack for message#123")感觉很尴尬,必须有更好的方法.

c linux networking tcp

12
推荐指数
3
解决办法
7541
查看次数