Articles of pipe理员

Linux上的pipe道读取primefaces(多个作者,一个读者)?

我有多个进程(和一些进程中的多个线程)写入一个命名pipe道。 每个作者用O_WRONLY打开pipe道。 我有另一个过程从这个pipe道读取,阻塞与select 。 pipe道用O_RDONLY | O_NONBLOCK打开 阅读器中的O_RDONLY | O_NONBLOCK 。 在读取器中select唤醒时,将最多read一个可用数据块,或者可能返回多个块? 如果是前者,那么我期待在读完第一个块后, select会立即醒来,直到我读完剩下的块。 或者可以readless于一个由作家写的块? 我正在写和读取string,他们都小于PIPE_BUF ,所以我知道写入是primefaces。 我可以很容易地附加一个分隔符来检查多个string,但我只是好奇它是如何工作在Linux上。

将terminal显示输出写入文件

我正在试图写一个文件terminal显示输出。 有没有任何pipe道命令同时运行下面的两个命令, 但顺序。 所以基本上首先会运行第一个命令,第一个命令的结果将被第二个命令使用。 现在我正在一个接一个地运行命令。 python test_1_result.py > result_1.txt python test_2_result.py > result_2.txt 在此先感谢您的任何build议。

Linux内核如何决定使用哪个内存区域?

当我检查pagetypeinfo cat / proc / pagetypeinfo 我看到三种types的内存区域; DMA DMA32 正常 Linux如何select一个内存区域来分配一个新的页面?

是否有可能将现有的缓冲区映射到一个新的文件?

这个想法相对简单,但是我看到了一些实现的复杂性,所以我想知道现在是否有可能。 我想要做的一个例子是在缓冲区中生成一些数据, 然后将这个缓冲区的内容映射到一个文件。 而不是有内存空间虚拟填充的文件的内容,我想原始缓冲区的内容被转移到系统caching(这应该是一个零拷贝操作),并立即变脏(这将刷新数据最终输出到磁盘)。 当然,我提到的复杂性是缓冲区应该被解除分配和取消映射(因为数据现在是系统caching的责任),我也不知道该怎么做。 重要的方面是: 该程序可以控制何时创build文件链接。 该程序不需要预测文件的大小,也不需要随着数据集的增长重新映射。 相反,它可以重新分配初始缓冲区(使用一个有效的内存分配器),直到它被满足(它确信数据集不会再增长),然后才能将其映射到文件。 即使在映射到文件之后 ,数据仍然可以通过相同的虚拟内存地址访问,仍然没有单个内存中的副本。 一个假设是: 我们可以使用一个任意的内存分配器(或一般的内存pipe理scheme),它可以比mmap / mremap能够更有效地pipe理dynamic缓冲区,因为后者必须处理文件系统来扩大/缩小文件,总是会变慢。 所以,(1)这些要求是否受到限制? (2)这个假设是否正确? PS:我不得不随便select这个问题的标签,但我也有兴趣听到BSD和Windows如何做到这一点。 当然,如果POSIX API已经可以做到这一点,那就太好了。 更新:在主内存中分配的私有内存空间(对于具有正常VMM的任何操作系统中的进程/任务是私有的)调用一个缓冲区。 高级目标包括使用另一个input(在我的情况下是networking)生成一个任意大小的数据集,然后一旦生成,使其可访问很长一段时间(到networking和进程本身),保存到磁盘的过程中。 如果我将数据集保存在私有内存中并正常写出,那么当操作系统需要这些空间时,它们就会被交换,这有点愚蠢,因为它们已经在磁盘上了。 如果我映射另一个区域,那么我必须将缓冲区的内容复制到该区域(驻留在系统caching中),这又是一个愚蠢的行为,因为之后我不会使用该缓冲区。 我所看到的另一种方法是编写或使用一个成熟的用户态caching读取和写入磁盘本身,以确保(a)页面不会被无用地换出,并且(b)该过程不会保存太多的内存对于自己来说,这是永远不可能做到最好的(最好是让内核完成工作),这根本不是我认为值得下的道路(对于较less的收益太复杂了)。 更新:要求2和3是考虑Nominal Animal的答案的非问题。 当然这意味着这个假设是不正确的,正如他certificate的那样(开销很小)。 我也放宽了要求1, O_TMPFILE确实是完美的。 更新: 最近一篇关于LWN的文章在中间的某个地方提到: “这可能是通过一个特殊的写操作来完成的,这个操作实际上不会导致I / O,或者是通过系统调用将物理页面转移到页面caching中” 。 这意味着目前(2014年4月)没有办法做到这一点,至less在Linux(以及可能的其他操作系统),less得多的标准API。 这篇文章是关于PostgreSQL的,但是这个问题是相同的,除了这个问题的具体要求,这些都没有在文章中定义。

如何在Linux中创build大小的FIFO缓冲区?

具体来说,我试图从设备捕获audio或videostream,并按下button时只保留X分钟(或Y MBytes)。 任何本地的方式来做到这一点在Linux? 我知道fifo,但只是保留所有的数据。 我想pipe我的stream到一个特定的缓冲区,只保留最后的Y MBytes,并丢弃其余的。 谢谢

保护页面的mprotect(地址,大小,PROT_NONE)及其内存消耗

我使用memalign分配了一些内存,并使用mprotec(adde, size, PROT_NONE)将最后一页设置为警戒页面,因此无法访问此页面。 不可访问的页面是否消耗物理内存? 在我看来,内核可以安全地离线物理页面,对吧? 我也尝试疯狂(MADV_SOFT_OFFLINE)手动使物理内存脱机,但function总是失败。 任何人都可以通过mprotect(PROT_NONE)告诉我内核的内部行为,以及如何离线物理内存以节省物理内存消耗?

find堆空间后的逻辑可用

嗨,我是一个新的内存pipe理,我只是想find逻辑来find免费的堆空间。 我觉得通过find“ 程序中断 ”和“ 堆栈指针 ”的区别,我们可以得到它是正确的吗? 如果不是,请说明理由,让我知道正确的逻辑。

使用fork()和pipe道的进程环

一个小时以来,我一直在想我这个问题。 我必须用n个进程创build一个进程环(数量作为参数通过cmd传递)。 父进程将他的PID发送给他的第一个孩子,这个人把他的父母的PID和他自己的PID发送给他的下一个兄弟,直到我们创build了n个孩子。 之后,父进程得到所有他的孩子的PID的增加。 假设父进程的PID是3400,我们创build了两个subprocess,所以环是由三个进程组成的 3400 + 3401(第一个孩子的PID)+ 3402(第二孩子的PID)= 10203 父进程应该得到这个10203。 我曾经想过一个“for”循环,在这个循环中,subprocess只使用一个pipe道将其兄弟PID从兄弟添加到兄弟。 尽pipe如此,我还没有遇到一个解决scheme。

在bash脚本中分配“at”命令的输出

我试图捕获Bash脚本中的“at”命令的结果。 捕获命令输出的各种方法似乎不起作用,但我不确定它是命令中的pipe道还是别的东西。 echo $cmd | at $deployat 产生输出 job 42 at 2014-04-03 12:00 而且我正在努力争取时间。 不过,我期望的是类似的东西 v=$($cmd | at $deployat) echo $v 会工作,或 v=$(echo $cmd | at $deployat) echo $v 要么 v=`$cmd | at $deployat` echo $v 但是,所有这些都将剧本挂起,看起来像是在等待一些input。 什么是正确的方法来做到这一点,最终像一个variables: 2014-04-03 12:00 ============================ 编辑: 一个可能的并发症是$ cmd带有标志: ls -l 例如。 扩展的命令可能是这样的: echo ls -l | at noon tomorrow […]

grep -v'。*'不起作用

正如所料,这个完全无用的命令不包括pipe理grep的所有内容: $ man man | grep -v '.*' $ 我如何得到输出pipe道bind -p这个? $ bind -p | grep -v '.*' "?": self-insert "?": self-insert "?": self-insert "?": self-insert "?": self-insert (227 more…) 退出码是0,没有写入stderr。