Articles of pipe理员

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

Linux内核/ proc FIFO /pipe道

我目前正在尝试创build一个内核模块,它将根据内核事件生成数据,并将它们推送到一个文件中。 在阅读后,这是不好的(我同意),我决定将一个/ proc文件中的数据放在一个用户程序可以从必要时拉的数据更有意义。 然而,这个想法导致了各种各样的问题,特别是在何时以及如何清除这个文件。 所以我想……“为什么我不在/ proc中创build一个命名pipe道,并从中读取? 我有一个为proc文件设置读取函数和写入函数的一般要点,但是我仍然有一个概念上的麻烦,我怎么去做这件事。 也就是说,我将如何编写这样一个函数来获取任意数据并将其写入内核的pipe道? 有没有人有任何想法如何将数据从内核空间推送到命名pipe道? 最后,它不一定是/ proc文件(特别是如果我这样做是错误的),但这是我来到的结论。 然后,我将不得不弄清楚如何从用户空间程序附加到它,但我觉得这是一个单独的问题。

Linux如何保护内存?

我感兴趣的是从组装的angular度来看linux如何在保护模式下运行。 当把CPU置于i386:0x86_64机器的保护模式时,使用哪些寄存器和中断? 我理解内存pipe理是如何工作的,当我看着像mmap和mprotect这样的函数的c源代码,然而什么让我无法接pipe程序集呢? 我在哪里可以得到更多的信息呢?

UNIX / Linux IPC:从pipe道读取。 如何知道运行时的数据长度?

我有一个subprocess生成一些可变长度的输出,然后使用半双工pipe道将其发送给父进程。 在父,如何使用read()函数? 由于每次数据可以有不同的长度,我怎么能在运行时知道数据的大小来做缓冲区的任何malloc()? fstat()函数可以在pipe道文件描述符上使用吗? 我知道read()函数将读取指定数量的字节,但如果在请求的字节被读取之前到达文件结尾(而不是EOF字符),将返回0。 我专门运行一个2.6.27-9内核的Ubuntu GNU / Linux。 理查德·史蒂文森在UNIX环境下的高级编程中的所有例子都指定了写入pipe道时的数据长度,或者依赖于fgets()stdio.h函数。 由于我关心速度,我想尽可能远离使用stdio.h。 这将有必要共享内存更快? 谢谢,德鲁夫

堆内存和板分配

我对heap和free list感到困惑。 我有几个问题,我有我自己的理解,如何在C中malloc工作。请纠正我,如果我错了。 堆内存是否组织为一个链表(空闲列表)的数据块? 堆内存和自由列表之间有区别吗? 我对存储分配的理解(打开以便改进): – 当我们调用malloc时,它在堆中分配内存,通过从free list中select合适大小的数据块来实现。 当malloc返回某个内存块时,它将从空闲列表中删除,并且在该页表中更新该块内存的物理地址。 当使用free()释放内存时,将数据块插回到空闲列表中,并且可能会减less碎片,并与相邻的块相结合,并且清除页表项中的present位。 所以整个堆是一个自由列表(空闲块的链表)+分配的数据块。 这是一个存储分配的全面情况? 编辑:从Linux内核开发(罗伯特·洛夫)章内存pipe理, 板分配 “空闲列表包含一个可用的,已分配的数据结构块,当代码需要一个新的数据结构实例时,它可以从空闲列表中获取一个结构,而不是分配足够的内存并设置它之后,当数据结构不再需要的时候,它将被返回到空闲列表而不是释放,这样,空闲列表作为一个对象caching,caching一个经常使用的对象types。 自由列表被称为“可用的,分配的数据结构块”。 它是如何分配 ,当它在一个自由列表? 而如何返回一块内存空闲列表_ 不是像释放该块一样? 板块分配如何与存储分配不同?

为什么du或echostream水线不工作?

我试图使用du命令为当前的每个目录。 所以我试图使用这样的代码: ls | du -sb 但它没有按预期工作。 它只输出当前的大小。 目录,这就是所有。 回声也是一样的 ls | echo 输出空行。 为什么发生这种情况?