Articles of pipe理员

Python和FIFO

我试图了解在Linux下使用Python的FIFO,我发现了一个奇怪的行为,我不明白。 以下是fifoserver.py import sys import time def readline(f): s = f.readline() while s == "": time.sleep(0.0001) s = f.readline() return s while True: f = open(sys.argv[1], "r") x = float(readline(f)) g = open(sys.argv[2], "w") g.write(str(x**2) + "\n") g.close() f.close() sys.stdout.write("Processed " + repr(x) + "\n") 这是fifoclient.py import sys import time def readline(f): s = f.readline() […]

如何使用Linux的splice()函数将文件复制到另一个文件?

这里是关于splice()的另一个问题。 我希望使用它来复制文件,并试图使用拼接的维基百科页面上的例子一样的pipe道连接的两个拼接调用。 我写了一个简单的testing用例,它只尝试从一个文件读取第一个32K字节,并将它们写入另一个文件: #define _GNU_SOURCE #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> int main(int argc, char **argv) { int pipefd[2]; int result; FILE *in_file; FILE *out_file; result = pipe(pipefd); in_file = fopen(argv[1], "rb"); out_file = fopen(argv[2], "wb"); result = splice(fileno(in_file), 0, pipefd[1], NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE); printf("%d\n", result); result = splice(pipefd[0], […]

python Pipes的同步/asynchronous行为

在我的应用程序中,我使用多处理模块中的pipe道在python进程之间进行通信。 最近我观察到一个奇怪的行为取决于我通过他们发送的数据的大小。 根据python文档,这些pipe道是基于连接的,并且应该以asynchronous的方式运行,但是有时他们在发送时会卡住。 如果我在每个连接中启用全双工,一切工作正常,即使我没有使用连接发送和收听。 任何人都可以解释此行为? 100浮点数,全双工禁用 代码工作,利用asynchronous。 100个浮点,全双工启用 该示例正常工作正常。 10000浮点数,全双工禁用 尽pipe数据较小,但执行被永久封锁。 10000浮点,全双工启用 再次罚款。 代码(这不是我的生产代码,它只是说明了我的意思): from collections import deque from multiprocessing import Process, Pipe from numpy.random import randn from os import getpid PROC_NR = 4 DATA_POINTS = 100 # DATA_POINTS = 10000 def arg_passer(pipe_in, pipe_out, list_): my_pid = getpid() print "{}: Before send".format(my_pid) pipe_out.send(list_) print "{}: […]

无法连接到远程MongoDB服务器

我正在尝试创build一个远程MongoDB服务器来处理我的Java项目。 我正在使用stream浪者+ ansible创造环境,但可惜我无法获得连接。 我总是通过networking拒绝连接。 本地主机上的相同代码完美地工作。 我正在使用stream浪汉箱: chef/centos-6.5 我的任务如下: – name: Download EPEL Repo get_url: url=http://dl.fedoraproject.org/pub/epel/6/x86_64/epel- release-6-8.noarch.rpm dest=/tmp/epel-release-6-8.noarch.rpm – name: Install EPEL Repo command: rpm -ivh /tmp/epel-release-6-8.noarch.rpm creates=/etc/yum.repos.d/epel.repo – name: Install libselinux-python yum: name=libselinux-python – name: Create the repository for 10Gen copy: src=10gen.repo.j2 dest=/etc/yum.repos.d/10gen.repo – name: Create the EPEL Repository. copy: src=epel.repo.j2 dest=/etc/yum.repos.d/epel.repo – name: Create […]

munmap()与私有匿名映射的ENOMEM失败

我最近发现,如果VMA(虚拟内存区域)结构的数量超过vm.max_map_count,那么Linux不能保证使用munmap()可以释放使用mmap()分配的内存。 Manpage明确指出: ENOMEM The process's maximum number of mappings would have been exceeded. This error can also occur for munmap(), when unmapping a region in the middle of an existing mapping, since this results in two smaller mappings on either side of the region being unmapped. 问题是如果可能的话,Linux内核总是试图合并VMA结构,即使对于单独创build的映射,munmap()也会失败。 我能写一个小程序来确认这个行为: #include <stdio.h> #include <stdlib.h> #include <errno.h> #include […]

在C中的subprocess和父进程之间的通信linux:父进程不阻塞

我想让父进程和subprocess在C使用pipe道进行通信。 首先,我想要父母传递一个string,然后孩子承认它。 我创build了两个文件描述符。 一个为父母对孩子即读音pipe和另一个反向笔pipe。 问题是它不把我的数据作为input。 另外,我希望printf语句(如“input您的数据”)被打印一次,但自fork之后,有两个进程,所以它们被显示两次。 任何替代scheme? //readpipe[0] = child read //readpipe[1]= parent write //writepipe[0]=parent read //writepipe[1]=child write #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <string.h> int main(void) { pid_t pid; int r; /* Hope this is big enough. */ char buf[1024]; char cp[50]; char ans; int readpipe[2]; int writepipe[2]; int a; int […]

Linux:如何检查进程可用的最大连续地址范围

我想在命令行中inputpid,并取回未被保留的最大的连续地址空间。 有任何想法吗? 我们的32位应用程序运行在64位RHEL 5.4上,运行了一段时间,比如说24小时。 那个时候内存使用量只有2.5GB,但是内存出错了。 我们认为它无法映射大型文件,因为应用程序的内存空间是分散的。 我想出去到生产服务器,只是testing这个理论。

在“分叉”进程的同时,为什么Linux内核为每个新创build的进程拷贝内核页表的内容呢?

以下讨论适用于32位ARM Linux内核。 我注意到,在分叉过程中,Linux内核将内核页表(master page table,即swapper_pg_dir )的内容复制到每个新创build进程的页表中。 问题是: 为什么打扰呢? 为什么不能为每个新创build的进程共享单个内核页表副本(关于32位ARM Linux的更高的1G部分),而不是memcpy交换页表? 这是浪费内存吗? 相关源代码(“ – >”代表函数调用): do_fork – > copy_process – > copy_mm – > dup_mm – > mm_init – > mm_alloc_pgd – > pgd_alloc – > /* * Copy over the kernel and IO PGD entries */ init_pgd = pgd_offset_k(0); memcpy(new_pgd + USER_PTRS_PER_PGD, init_pgd + USER_PTRS_PER_PGD, […]

mlock() – 页面是静态的,还是可以在物理RAM中移动?

根据mlock()手册页: 当呼叫成功返回时,包含指定地址范围一部分的所有页面保证驻留在RAM中; 页面被保证留在RAM中,直到后来解锁。 这是否也保证这些页面的物理地址在其整个生命周期中是恒定的,或者直到解锁? 如果没有(也就是说,如果它可以被内存pipe理器移动 – 但仍然保留在RAM中),有什么可以说的新位置,或事件发生这样的变化? 更新: 关于RAM中locking页面的一致性,可以说任何东西吗? 如果CPU有caching,那么mlock-ing保证与caching的RAM一致性(假设回写caching)?

在Ubuntu的单声道和非托pipe代码

我使用在Ubuntu 12 x64上运行的Mono 2.10。 现在我需要知道如何使用非托pipe代码。 [DllImport("libc.so")] public static extern int getpid (); 而且,在下一步我有: getpid(); 我收到这个错误 $ MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono libc_test.exe Mono: DllImport attempting to load: 'libc.so'. Mono: DllImport loading library: '/home/ibaranov/Documents/MONO/libc_test/libc_test/bin/Debug/libc.so'. Mono: DllImport error loading library '/home/ibaranov/Documents/MONO/libc_test/libc_test/bin/Debug/libc.so: cannot open shared object file: No such file or directory'. Mono: DllImport loading library: '/home/ibaranov/Documents/MONO/libc_test/libc_test/bin/Debug/libc.so'. Mono: DllImport error […]