Articles of pipe理员

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 输出空行。 为什么发生这种情况?

我如何从我的Windows机器上运行安装在Linux机器上的OpenGL应用程序?

本着帮助的精神,这是一个我已经解决的问题,所以我会在这里回答这个问题。 问题 我有: 必须在Redhat或SuSE企业上安装的应用程序。 它有巨大的系统需求,需要OpenGL。 它是需要在一台机器上一起操作的一套工具的一部分。 此应用程序用于在工时方面的时间密集型任务。 我不想坐在这个应用程序的服务器机房工作。 所以,问题出现了…如何从远程Windows机器上运行此应用程序? 我将概述我的解决scheme。 随意评论替代品。 此解决scheme也适用于更简单的环境。 我的情况有点极端。

如何在两个进程之间用pipe道发送整数!

我想在POSIX系统中用pipe道发送一个整数,但是write()函数用于发送string或字符数据。 有没有办法用pipe道发送整数? 问候

读取不阻塞命名pipe道

我有下面的C代码从pipe道读取,然后应该阻止,但它永远不会阻止 int pipe_fd; int res; int open_mode = O_RDONLY; char buf[100]; int bytes_read = 0; memset (buf, '\0', sizeof(buf)); pipe_fd = open(FIFO_NAME, open_mode); if (access(FIFO_NAME, F_OK) == -1) { res = mkfifo(FIFO_NAME, 0777); if (res != 0) { fprintf (stderr, "Could not create fifo %s\n", FIFO_NAME); exit (EXIT_FAILURE); } } for(;;) { do { res […]

Bash匿名pipe道

当devise一系列命令来执行某个任务时,我遇到了匿名pipe道不像预期那样的问题。 由于我正在运行的原始命令太复杂了,所以在这里我已经创build了一个显示问题的例子(我知道所有这些命令基本上什么都没有做)。 此外,我使用PV来显示数据是否实际上从input复制到输出。 cat /dev/zero | pv > /dev/null 这按预期工作。 (将数据从/ dev / zero复制到/ dev / null) cat /dev/zero | tee /dev/null | pv > /dev/null 这也按预期工作(复制数据并将两个副本发送到/ dev / null) cat /dev/zero | tee >(pv -c > /dev/null) | pv -c > /dev/null 这个命令只有部分工作。 虽然从STDIN到STDOUT的拷贝仍然有效,(一个pv会在短时间内显示进度),但是整个命令会被匿名pipe道阻塞,而这个匿名pipe道并没有收到任何东西,因此其中一个输出不能被写入(我通过让它写入文件而不是/ dev / null来检查这一点)。 如果有人有一个想法,为什么这不起作用(如预期?)在bash中,我会很高兴的帮助。 PS:如果我使用zsh而不是bash,命令按预期运行。 不幸的是,这个需要运行的系统没有zsh,并且我没有办法在部署的系统上获得zsh。

截断内存映射文件

我正在使用内存映射IO的索引文件,但问题是,我不能resize为空的文件。 某处之前: MappedByteBuffer map = raf.getChannel().map(MapMode.READ_WRITE, 0, 1 << 30); raf.close(); // use map map.force(); map = null; 调整: for (int c = 0; c < 100; c++) { RandomAccessFile raf = new RandomAccessFile(indexFile, "rw"); try { raf.setLength(newLen); if (c > 0) LOG.warn("used " + c + " iterations to close mapped byte buffer"); return; […]