Articles of stdio

我可以将父进程的stderrredirect到分支进程上的套接字文件描述符吗?

我编写了一个守护进程,在开发过程中,它的debugging信息会进入stderr(在完全被“守护进程”之前)。 现在代码更成熟了,所以stderr已经通过freopen(2)调用redirect到了/dev/null 。 为了debugging的目的,我真的希望能够连接到服务器守护进程,发送一个命令,神奇地开始通过套接字发送stderrstream。 有没有一种方法(在分叉的过程中)对父进程的 stderr 对subprocess套接字文件描述符执行“ dup(2) ”类似的操作? 只有Linux的解决scheme是可以接受的 有大量的代码打印到stderr , 为了validation的目的 ,我宁愿不去碰。 如果dup2可以做我所要求的,这将工作: redirectSTDOUT和STDERR到C中的套接字?

查找由fmemopen创build的文件的大小

我正在使用fmemopen创build一个variablesFILE* fid将其传递给一个函数从打开的文件中读取数据。 在这个函数的某个地方,它使用下面的代码来找出文件的大小: fseek(fid, 0, SEEK_END); file_size = ftell(fid); 这在常规文件的情况下效果很好,但是在由fmemopen创build的文件ID的情况下,我总是得到file_size = 8192 任何想法为什么发生这种情况 有没有一种方法来获得适用于常规文件和用fmemopen创build的文件的正确的文件大小? 编辑:我打电话给fmemopen : fid = fmemopen(ptr, memSize, "r"); memSize != 8192 EDIT2: 我创build了一个最小的例子: #include <cstdlib> #include <stdio.h> #include <string.h> using namespace std; int main(int argc, char** argv) { const long unsigned int memsize = 1000000; void * ptr = malloc(memsize); FILE *fid […]

让fgets在Linux上发出更长的read()调用

我正在阅读使用fgets相当大的文本(高达128K)的文本。 我看到服务器上的过度的上下文切换,使用strace我看到以下内容: read(3, "9005 10218 00840023102015 201008"…, 4096) = 4096 即fgets读取4096个字节的块。 有没有什么办法来控制fgets调用read()时使用的大块?

在一个命令的末尾,“</ dev / null>&/ dev / null”是做什么的?

我通过ssh运行的脚本之一是挂起来,我发现它在这个网站上的解决scheme: http : //www.snailbook.com/faq/background-jobs.auto.html 该站点通过将此添加到命令的末尾来解决问题: xterm < /dev/null >& /dev/null & 我想我知道它是做什么的,但是有人可以帮忙解释一下吗? 第一部分: # For stdin, read from /dev/null < /dev/null 第二部分: >& /dev/null 什么是>&做的? 我已经看过2>&1 ,它是直接STDERR到STDOUT,但是当没有数字,这是否意味着将所有的东西都redirect到/dev/null ?

即时获取另一个程序的输出作为input

我有两个程序,我用这种方式: $ c_program | python_program.py c_program使用printf()和python_program.py使用sys.stdin.readline()读取数据, 我想使python_program.py进程c_program的输出,因为它立即打印,以便它可以打印自己的当前输出。 不幸的是python_program.py只有在c_program结束之后才能获得input。 我该如何解决这个问题?

强制程序在redirect时刷新其标准输出

我有一个封闭的源程序,打印输出到标准输出。 我需要parsing输出。 所以我redirect输出到fifo(从我可以读取在父进程分叉和执行二进制)使用dup2,然后执行该程序。 问题是文件中的fprintf调用被缓冲,因为它正在写入一个文件。 在调用exec之前,我尝试在标准输出上用_IONBF调用setvbuf。 但问题依然存在。 为什么setvbuf在我的情况下没有帮助? 我怎样才能强制输出得到刷新?

在win32下的stdin上使用fread()的问题

我想parsing从二进制模式下的标准input数据在Win32下。 我的代码所做的第一件事是在开头检查一个4字节的标题: int riff_header; fread(&riff_header, sizeof(riff_header), 1, ifp); // 'RIFF' = little-endian if (riff_header != 0x46464952) { fprintf(stderr, "wav2msu: Incorrect header: Invalid format or endianness\n"); fprintf(stderr, " Value was: 0x%x\n", riff_header); return -1; } stdin在读取之前已经切换到二进制模式: if (*argv[argc-1] == '-') { fprintf(stderr, "Reading from stdin.\n"); infile = stdin; // We need to switch stdin to binary […]

为什么printf()不输出这个整数作为浮点数?

我有这个代码: #include <stdio.h> int main() { int i = 12345; printf("%f", i); return 0; } printf()将输出0.000000,不应该printf()将i包含的位作为浮点数来解释?

如何在等待terminalinput的同时处理窗口事件?

我有一个跨平台(windows和unix + xcb)terminal+ graphics_window应用程序,它大多数工作正常,直到您等待太长时间在input提示,在重载下图像可能会消失。 🙁 我有一个解释器(postscript解释器)的主循环(REPL),它每次在其循环中调用一个事件处理函数。 事件处理程序执行通常是窗口的消息/事件循环的一个迭代。 但是input是用普通的C / O进行处理的,所以事件处理程序在fgetc()被阻塞时不会被调用。 graphics窗口是仅输出的。 它没有button,只需要响应Raise,Map,Expose等事件。 如何在input读取循环的过程中调用事件处理程序? 这需要使用POSIX和win32 API来实现。 选项似乎是 非阻塞I / O 在unix中比较简单。 看起来像在窗户上的痛苦 轮询 input线程 并行线程? 窗口线程 并行线程? 这些中的任何一个可能会比其他人更不痛苦? 如果我可以留在unix上,那么这似乎是完成了一个窍门: #include <errno.h> #include <stdio.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> void idleproc () { /* simulates calling the event handler (ie. one slice of the window loop) […]

WIndows:subprocess制作新的控制台窗口,丢失stdin / out

我正在使用Windows Vista和Python 2.7.2,但答案不需要在Python中。 所以我可以使用命令行程序(例如dir)来启动并与subprocessstdin / stdout进行交互(使用python)。 – 然而 – 我现在想要调用的程序喜欢在Windows(不是诅咒)上为自己创build一个新的控制台窗口,即使从一个预先存在的cmd.exe窗口运行,也可以使用新的句柄。 (奇怪,因为它是VLC的“遥控”界面。)有什么办法可以: 获取进程控制台的stdin / out的句柄; 要么 让新的shell在旧版本中运行(如从bash中调用bash)? 否则,我可以破解subprocess的代码,将如何在Windows中设置新的控制台,并在/输出转移? 编辑:也就是说 >>> p = Popen(args=['vlc','-I','rc'],stdin=PIPE,stdout=PIPE) # [New console appears with text, asking for commands] >>> p.stdin.write("quit\r\n") Traceback: File "<stdin>", line 1, in <module> IOError: [Errno 22] Invalid argument >>> p.stdout.readline() '' >>> p.stdout.readline() '' # […] 但是新出现的控制台窗口也不接受键盘input。 通常情况下: […]