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在我的情况下没有帮助? 我怎样才能强制输出得到刷新?

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。 通常情况下: […]

Windows中的二进制输出

我写了一个读取二进制文件的程序,用它的内容进行一些处理,并将结果写入不同的文件。 在Linux中它完美的工作,但在Windows中,它不工作; 输出文件总是1KB … 这是该程序的简化版本: #include <stdio.h> void copyFile(char* source, char* dest); int main (int argc, char* argv[]) { if (argc != 3) printf ("usage: %s <source> <destination>", argv[0]); else { copyFile(argv[1], argv[2]); } } void encryptFile(char* source, char* destination) { FILE *sourceFile; FILE *destinationFile; int fileSize; sourceFile = fopen(source, "r"); destinationFile = fopen(destination, "w"); […]

你怎么能使用文件描述符来刷新写入?

事实certificate,对open()和fopen()的误解源于ARM上的Linux 2.6.14内核中有错误的I2C驱动程序。 支持一个工作位的巴士司机解决了我想在这里解决的问题的根源。 我试图找出在Linux(I2C)串行设备驱动程序的问题。 看来,通过添加定时操作系统暂停(睡觉)之间的写入和读取设备的事情工作…(很多)更好。 除此之外,I2C的本质是主机读取或写入的每个字节都由线路另一端(从机)的设备确认 – 暂停的改进促使我将驱动程序视为asynchronous工作 – 这是我与巴士的工作方式无法协调。 Anyhoo … 我想要刷新写入以确保(而不是使用固定持续时间的暂停), 或以某种方式testing写入/读取事务已经以multithreading友好的方式完成。 使用fflush(fd);的麻烦fflush(fd); 是它需要'fd'是stream指针(而不是文件描述符),即 FILE * fd = fopen("filename","r+"); … // do read and writes fflush(fd); 我的问题是,我需要使用ioctl() ,它不使用stream指针。 即 int fd = open("filename",O_RDWR); ioctl(fd,…); build议?

在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 […]