Articles of pipe理员

Linux – 在内核代码中映射用户空间内存

我写了一段代码,需要在SOCclosures之前存储位于特定物理地址的10k内存。 我的问题是这个物理地址不是内核空间的一部分,所以我必须创build一个ad -hoc内存映射,所以我可以访问这个内存空间。 我尝试使用io-remap,但它不(显然)工作在非内核空间。 有没有这样做的API? 我应该使用kmap吗? 提前致谢

Python程序吃RAM

我写了一个小程序,使用MinimalModbus通过串口收集数据。 数据被转储到一个CSV文件。 我已经阅读了SO和其他地方的几个职位。 提到的一些事情是: 尽可能使用懒惰评估(xrange代替范围) 删除大量未使用的对象 使用subprocess,当他们死亡时,内存由操作系统释放 脚本在这里 github上。 我也使用脚本定期上传这些文件到服务器。 这两个脚本都相当简单。 系统上也没有别的东西在运行,所以我觉得在这两个系统中只有内存占用正在发生。 什么是解决这个问题的最好方法。 我不是最愿意采用子stream程的。 一些更多的信息: 数据采集​​在Raspberry Pi(512 MB RAM)上 Python版本:2.7 RAM需要大约3-4天才能完全使用,之后RaspberryPi会冻结 我遵循这个指南来找出正在吃掉RAM的前20个程序。 $ ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 20 12434 2.2 python 12338 1.2 python 2578 0.8 /usr/sbin/console-kit-daemon 30259 0.7 sshd: 30283 0.7 -bash 1772 0.6 […]

麻烦命名pipe道和Fortran

我尝试通过命名pipe道build立一些fortran进程之间的通信。 但是,即使考虑一个非常简单的玩具,我也会遇到麻烦。 这是我的代码: program testfifo implicit none integer status write(*,*) "hello" call flush() open(unit=11,file="MyNamedPipe",action='write',form ='unformatted' $ ,iostat=status); close(11) write(*,*) "by" call flush() return end program testfifo 如果我运行它与一个正常的文件它的作品: /fortran > rm -f MyNamedPipe && touch MyNamedPipe /fortran > gfortran -o testfifo testfifo.f /fortran > ./testfifo hello by 但是,运行一个fifo我的程序卡住了: /fortran > rm -f MyNamedPipe && mkfifo MyNamedPipe […]

Gnome资源监视器报告的C ++程序中的内存使用情况:混乱

我看着我的应用程序消耗的内存,以确保我没有分配太多,并且对Gnome Resource Monitor向我展示的内容感到困惑。 我已经使用下面的代码片段分配两个单独的应用程序,否则相同的内存; 他们除了这个代码和一个scanf()调用暂停执行,而我抓住内存使用情况: malloc(1024 * 1024 * 100); 和 char* p = new char[1204*1024*100]; 下图显示了每个这些行之前和之后的应用程序的内存使用情况: 现在,我已经读了很多(但显然不够)关于内存使用情况(包括这个问题),并且在区分可写内存和虚拟内存时遇到了困难。 根据相关问题, “可写内存是您的进程使用写权限分配的地址空间量” 和 “虚拟内存是您的应用程序分配的地址空间” 1)如果我自己分配内存,当然它有写权限? 2)链接的问题也说明(关于malloc) “…实际上不会分配任何内存(详情请参阅malloc(3)页末尾的提示) 我没有看到任何“咆哮”,我的图像显示虚拟内存增加了! 有人可以解释这个吗? 3)如果我纯粹以下代码: char* p = new char[100]; 资源监视器显示内存和可写内存都增加了8KB – 就像我分配一个完整的一兆字节一样! – 虚拟内存增加0.1。 这里发生了什么? 4)我应该在资源监视器中查看哪些列,以查看我的应用使用了多less内存? 非常感谢您的参与,如果不清楚或遗漏了任何可能导致我自己find答案的事情,我深表歉意。

如何在Linux中限制ac代码的堆大小

我想知道是否可以限制在linux机器上执行的C代码的分配堆大小。 有可能吗? 这样做的目的是,除了其他全局variables和本地variables之外,我dynamic分配〜70KBytes的内存和〜20KByte的栈内存。 dynamic分配是通过malloc()完成的。 所以为了确认问题不是堆分配,我想限制将要运行的C代码的堆内存。 我在网上阅读了很less的文章,发现如果我们使用malloc(),内存可能是过度承诺,​​但是如果我们使用calloc(),我们将得到只有有用的内存没有过度承诺,​​因为calloc()必须初始化内存块在给予指针之前将其设为零。 但是由于初始化开销,我不想使用calloc()。

为什么挂在服务器的“sshd”两端打开的SSH命令等待输出?

这是在StackOverflow而不是SuperUser / ServerFault,因为它与系统调用和操作系统的交互是由sshd执行的,而不是我使用 SSH的问题(虽然这也是值得赞赏的:p)。 语境: 我通过SSH调用了一系列复杂的脚本,例如ssh user@host — /my/command 。 远程命令会执行很多复杂的分支和执行操作,并最终导致在远程主机上运行后台进程。 偶尔(我正在慢慢发疯,试图找出可靠的复制条件), ssh命令将永远不会返回到客户端shell的控制。 在这些情况下,我可以进入目标主机,看到一个sshd: user@notty进程,没有孩子无限期悬挂。 解决这个问题不是这个问题的关键。 这个问题是关于sshd进程在做什么的 。 SSH实现为OpenSSH,版本为5.3p1-112.el6_7。 问题: 如果我发现其中一个卡住了sshd s并对其进行了strace ,我可以看到它在两个句柄上进行select,例如select(12, [3 6], [], NULL, NULL或类似的。 handle是连接到SSH客户端的TCP套接字,另一个是pipe道, 另一端只在同一个sshd进程中打开,如果我使用这个SuperUser问题的答案通过IDsearchpipe道,包含对该pipe道的引用的进程是相同的进程, lsof证实了这一点:pipe道的读和写端都在同一进程中打开,例如(对于pipe道788422703和sshd PID 22744): sshd 22744 user 6r FIFO 0,8 0t0 788422703 pipe sshd 22744 user 7w FIFO 0,8 0t0 788422703 pipe 问题: 什么是SSH等待? 如果pipe道没有连接到任何东西,也没有subprocess,我无法想象它可能会发生什么事件。 什么是“循环”pipe道/它代表什么? […]

检测当前连接是否使用NetworkManager进行计量

如何检测当前连接是否标记为使用NetworkManager在系统上进行计量? 这是来自shell脚本,但我可以通过Python轻松调用任何C函数。

Linux shell中的pipe道pipe理

我目前正在研究如何将stream水线pipe理到shell中。 例如,在我的shell中,如果我input“ls | wc | less”。 这个操作的结果将是创build三个进程,ls wc和less。 ls的输出将被input到wc的inputinput中,并且wc的输出将被input到input的input中。 对我来说,这意味着在执行“ls | wc | less”时。 less的标准input不是键盘,而是wc的输出。 但是,less一些仍然会响应我的键盘。 为什么? 我不明白,因为对我来说,由于它已经被pipe道,所以对键盘不太敏感。 有人有一个想法吗? 谢谢

使用pipe道同步同级进程

我正在学习IPC使用pipe道。 父进程创build“n”个subprocess,并等待所有subprocess终止。 我希望第一个孩子在兄弟姐妹进程全部结束时得到通知。 我正在利用这个事实,即read()阻塞,直到它所有的WRITE结束都closures。 所以,在完成他们的工作之后,兄弟姐妹close() WRITE结束。 在我的代码中的问题是,第一个孩子的read()根本没有解锁,第一个孩子没有终止,因此父母继续等待。 我做错了什么? #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { int fd[2]; // 0 = READ end, 1 = WRITE end int ret = pipe(fd); pid_t wait_pid; int status = 0; int n = 4; for(volatile int i = 0;i […]

如何从pipe道读取一个长的?

这涉及进程间通信中的未命名pipe道。 我有一个pipe道,一个进程存储一个值,另一个想要读取这个数值,无论是int或long。 这是很好的描述http://tldp.org/LDP/lpg/node11.html如何在C中创buildpipe道。我的问题是如何从pipe道中读取长或int。 摘自上面提到的页面: /* Read in a string from the pipe */ int nbytes = read(fd[0], readbuffer, sizeof(readbuffer)); printf("Received string: %s", readbuffer); 那么,在generell我不知道如何在C(这就像一个文件?)处理pipe道,以及如何我可以读取除string以外的数据。