Articles of pipe理员

链接在Linuxpipe道使用pipe道()

我知道如何在Linux中用C创build一个pipe道,看起来像cat /tmp/txt |grep foo ,但是在实现多个链接pipe道时遇到问题,比如cat /tmp/1.txt | uniq -c | sort cat /tmp/1.txt | uniq -c | sort cat /tmp/1.txt | uniq -c | sort 。 如何用C在Linux中使用pipe() ? 更新:我已经知道了。 如果有人有同样的问题,这里是代码: enum PIPES { READ, WRITE }; int filedes[2]; int filedes2[2]; pipe(filedes); pipe(filedes2); pid_t pid = fork(); if (pid == 0) { dup2(filedes[WRITE], 1); char *argv[] […]

login过程作为协处理

我尝试运行login(1)过程作为我的程序的协处理。 程序应该接收login提示并写入login名。 login过程作为一个协处理器很好地启动。 但是在写入login提示之前它会立即退出。 该程序的简化版本(写东西等删除): int main( int argc, char** argv ) { int fd1[2]; int fd2[2]; if(( pipe(fd1) != -1 ) && ( pipe(fd2) != -1 )) { const pid_t child_pid = fork(); if( child_pid == 0 ) { dup2( fd2[0], STDIN_FILENO ); dup2( fd1[1], STDOUT_FILENO ); close( fd1[0] ); close( fd1[1] ); close( […]

复杂的bashpipe道在跳转中工作

我的意图是在一行中输出recursionwget日志,'状态栏'就好。 所以我组装了这个pipe道(我的wget调用有更多的select,但是我只留下了那些对于所描述的问题至关重要的东西): wget -r -nv ftp://example.com 2>&1 | cut -c1-80 | xargs -I line echo -ne 'line\033[0K\r' 让我解释一下我的意思。 也许我的命令有问题。 -r表示“recursion下载”; -nv使关于每个下载的消息变得简短,如:“time:URL – > local file”; &2>1将stderrredirect到stdout,所以我可以通过pipe道处理消息。 | cut -c1-80 | cut -c1-80将输出行剪切为80个字符。 有时URL和本地文件名一起构成一个长的string,将一行分成两行或更多。 我需要它来适应一个控制台的一行。 这里只是站在80这个例子。 在我的脚本中,我用tput cols来确定控制台宽度; | xargs -I line echo -ne 'line\033[0K\r' | xargs -I line echo -ne 'line\033[0K\r'打印上一个命令的输出并添加两个特殊字符: \033[OK – 行结束,清除行的其余部分,如果前面有任何字符输出; 和\r […]

在Linux中获取内存许可详细信息

我正在使用mmap分配内存,并将一些页面标记为PROT_READ,而将less量页面标记为使用mprotect的PROT_NONE。 我的实现有基于内存权限的逻辑。 目前我有内存位置信息,如何获得当前的保护状态? (PROT_READ / PROT_NONE)

Bash脚本用于计算应用程序的内存

我想要一个bash脚本,它将计算特定应用程序或命令使用的内存量。

如何在mmap更新(或延迟mmap页面caching刷新)上优先执行write()

我正在用64G的RAM和大量的磁盘空间在debian-64上运行一个专门的数据库守护进程。 它使用磁盘哈希表(mmaped),并使用正常的write()调用将实际数据写入文件。 在进行大量更新时,mmap的很大一部分会变脏,而页面caching会尝试将其刷新到磁盘,从而产生大量的随机写入,从而降低了对数据文件进行常规(顺序)写入的性能。 如果有可能延迟页面高速caching刷新mmaped区域性能将改善(我假设),因为脏页面的几个(或全部)更改将被写入一次,而不是每次更新一次(最坏的情况下,在现实中无论如何,它总会有很多变化)。 所以我的问题:是否有可能延迟页面caching刷新内存映射区域? 还是有可能优先考虑正规写作? 还是有没有人有任何其他的想法? madvise和posix_fadvise似乎没有任何区别…

Linux shell模拟:卡在多个pipe道上

我知道类似的问题已经被问到,但没有答复帮助我。 我试图实现一个微型的Linuxshell,并坚持在多个pipe道。 带有单个pipe道的命令(例如ls | wc )可以工作,但是如果我添加第二个pipe道,控制台上不会显示任何内容。 这是我的代码。 void ExecuteCommand(NODE *cHead,NODE *oHead) { int fd[10][2]; // file descriptors' array int nfdCnt = 0 ; // file descriptors counter string strCmd; // command string strOp = ""; // operator int nOpCnt = 0 ; // operator count while(1) { if (cHead != NULL) // cHead is head […]

堆栈展开后,Linux堆栈驻留内存不回收

如果在堆栈上分配,Linux不会使用内存。 堆 我在堆上dynamic分配(malloc / mmap)1GB。 在configuration之前: $顶部 虚拟内存1GB 常驻记忆〜0 memset 1GB $顶部 虚拟内存1GB 常驻内存1GB 释放1GB的(free / munmap) – 按预期回收 $顶部 虚拟内存1GB 常驻记忆〜0 堆 我在堆栈上dynamic分配1GB。 之前: $顶部 虚拟内存1GB 常驻记忆〜0 memset 1GB $顶部 虚拟内存1GB 常驻内存1GB 1GB的释放(堆栈展开) – 驻留内存仍为1GB,即使释放后也是如此! 为什么? $顶部 虚拟内存1GB 常驻内存1GB 为什么当堆栈解压驻留内存(物理页面仍在使用)? 堆段的分配是用mmap完成的,堆段的分配是用mmap完成的 – 那为什么回收的行为有差别呢?

哪些文件包含malloc()和new()的实现?

在Linux(Ubuntu)上,我可以看到malloc()和new()实现中使用的C / C ++代码的path和文件名是什么? 我看了/ usr / include,却开始迷路了。 这取决于我安装了哪个版本的gcc / g ++? 如果有人也可以给出一个普遍的答案,这将有助于我理解Linux如何存储所有的“本地”function,这将是最值得赞赏的,我不会再要求一个不同的function。

kmalloc()可以返回无效的内存吗?

我正在写一个Linux内核模块,在其中我实现了一个链表。 我知道在Linux内核中有一个列表API,但是当我实现它时,我不知道如何使用kmalloc()处理原始指针。 运行几个小时后,内核崩溃,崩溃日志中显示“常规保护错误”。 日志还显示,它是从我的functionsearch链接列表中发生。 显然searchfunction就像下面没有逻辑错误。 /* * Searches in a certain index of hash table for a data * returns NULL if not found else returns pointer of that element in the table */ struct queue_data * search_table(unsigned int hash_index, struct queue_data *new_data) { /* Taking a new queue pointer. Which will be pointing to […]