Articles of pipe理员

如何处理内存分配失败新的(nothrow)在Linux上的C + +

在没有例外的情况下,我看到了几个post的说法 Thing* t = new(std::nothrow) Thing; // returns NULL on failure if (!t) { // allocation failure } 例如 如何检查与新运营商的内存分配失败? 如果我的C ++“新”内存分配失败,如何找出返回值? 我相信这是他们从C ++标准得到的声明,如引用: 如果使用非抛出exception规范声明分配函数,则返回空值以指示分配存储失败,否则返回非空指针。 然而,通过Herb Sutter http://www.gotw.ca/publications/mill16.htm Linux将过度使用内存,而这不符合C ++标准。 即检查null与linux系统无关。 “新”要么成功要么失败,而被linux杀死的进程。 所以,我们能做些什么? 看来没有办法检查失败。 [更新]关于linux overcommit: overcommit_memory 0 – 默认设置。 内核执行启发式内存过度使用处理,通过估计可用的内存量和失败的请求是公然无效的。 不幸的是,由于内存是使用启发式而非精确algorithm分配的,因此此设置有时会使系统上的可用内存过载。

pipe道提供一个文件作为input到C程序

我有这个.gz文件,每个文件里面都有一个文本文件。 这个文本文件需要在C程序中使用。 下面的代码以某种方式解决了这个问题,其中参数1和2是我作为main()的C程序参数(argc,argv [])接收的整数。 gzip -dc xyz.txt.gz | ./program parameter1 parameter2 有人可以解释如何在命令行上面的代码工作? 文本文件如何自动传递给程序? 我需要在C程序中编写额外的代码来接收这个文本文件吗?

了解pipe道,redirect和IPC

我是新来的pipe道,并试图创build一对pipe道,允许subprocess写入父进程,父进程沟通回来。 有一个家长最多4个孩子。 这个孩子与执行官成为一个不同的计划。 我有什么工作: 从父母写入到subprocess。 当我阅读子程序的标准input时,它会收到我从父母写的内容。 目的: 要创build一个纸牌游戏,其中父母与每个客户(孩subprocess)交谈,并向他们提供所有的动作和信息,从标准输出到孩子的标准input。 个别的孩subprocess在他们的标准输出上回退,由主要父母读取。 游戏的动作完全由一个序列决定,而不是玩家。 所以这是一个机器人游戏。 我所坚持的是: 我不知道如何得到它,所以父母可以通过文件stream读取孩子的标准输出。 当我尝试从子行设置阅读时,代码似乎停止工作。 甚至孩子都不能从父母那里读到(似乎停止在现在注释掉的儿子父母的留置权)。 我也不确定如何“等”,直到出现。 就像在开始时玩家必须发送一个“准备好”的消息给父母,让他们知道他们正在工作。 一旦我从孩子那里发送“准备好”,我怎样才能无限期“等待”,直到下一条消息出现? 我不确定是否正确设置pipe道。 有人可以提供关于如何使用通信pipe道的指导,并确认下面的逻辑吗? 我为了得到父母给孩子写的信息是: 先创buildpipe道 将父进程分叉到另一个进程(subprocess) 将pipe道连接到父级的stdout,并使用dup2closures父级的读取侧并closures 将pipe道连接到孩子的标准input,并使用dup2closures孩子的写作部分并closures 从文件描述符中使用fdopen()获取文件stream,然后打印。 subprocessstdin现在是无论你打印到父母的标准输出。 它是否正确? 我尝试将这种逻辑应用于孩子,但将其颠倒过来。 将inputpipe道连接到读取文件stream,该文件stream是子程序从stdout写入的位置。 将输出pipe道连接到父节点读取的读取stream。 void start_child_process(Game *game, int position) { int child2Parent[2]; int parent2Child[2]; if (pipe(parent2Child)) { printf("PIPE FAIL!\n"); } if (pipe(child2Parent)) { printf("PIPE FAIL!\n"); } pid_t pid […]

从python3.4的fork进程中读取pipe道时出现“Bad file descriptor”

我使用python3.4的os.pipe做IPC下载父进程和subprocess,通过os.execlp args传递pipe道参数 self.child_pipe_read=int(sys.argv[2]) self.child_pipe_write=int(sys.argv[3]) … os.execlp('python3','python3','child_test.py',str(pid),str(self.child_pipe_read) ,str(self.child_pipe_write)) 但是,当我使用这个: msg=os.read(self.child_pipe_read,32) 抛出错误OSError:[错误9]错误的文件描述符 然后我尝试写入pipe道: os.write(self.parent_pipe_write,(msg+'\n').encode()) BrokenPipeError:[Errno 32]损坏的pipe道 我看到了python3.4的文档,find这个: “3.4版本更改:新的文件描述符现在是不可inheritance的”,但我不知道它的含义是什么? 我怎么可以用pipe道IPC?

进程间通信与pipe道和文件

我使用Linux作为操作系统,并尝试与pipe道和文件沟通三个进程。 它应该与STDIN上的任何文件一起工作。 而pipe道工作得很好,但第二个进程不能正确写入一个字符或第三个阅读。 首先当然我把函数初始化为semlock和semunlock,并且开放pipe道也在那里。 我感谢任何帮助,因为我不知道。 if (!(PID[1] = fork ())) { int BUF_SIZE = 4096; char d[BUF_SIZE]; while (fgets (d, BUF_SIZE, stdin) != NULL) { write (mypipe[1], &d, BUF_SIZE); } } if (!(PID[2] = fork ())) { int reading_size = 0; char r; close (mypipe[1]); semlock (semid1); while (reading_size = read (mypipe[0], &r, 1)) { […]

bash在通过一对文件迭代大约3600万行之后返回错误的结果 – 这是内存错误吗?

我在bash中编写了一个简单的脚本来遍历一对文本文件,以确保它们的格式正确。 所需格式如下: 每个文件包含数以百万计的“logging”。 每个logging在每个文件中占用两行 – 一个标题行和一个序列行。 每个标题行由一个“>”符号组成,后跟一个样本名称(字母数字string),后跟一个句点,后跟一个唯一的logging标识号(一个整数),后跟一个后缀'/ 1'或' / 2' 。 每个序列行包含30-100个A,C,G和T字符(四个DNA核苷酸,如果有人想知道的话)的string。 这些文件是成对的,因为一个文件中的第一个logging对应于第二个文件中的第一个logging,依此类推。 两个文件中的标题行应该是相同的,除了在一个文件中它们将全部具有“/ 1”siffix,在另一个文件中它们将具有“/ 2”后缀。 两个文件之间的序列行可能非常不同。 我开发的代码旨在检查(a)每个logging中的听众行遵循正确的格式,(2)两个文件中相应logging中的标题行匹配(即除/ 1和/ 2后缀)和(c)序列行只包含A,C,G和T字符。 格式正确的logging示例: > cat -n file1 | head -4 1 >SRR573705.1/1 2 ATAATCATTTGCCTCTTAAGTGGGGGCTGGTATGAATGGCAAGACGGGAATCTAGCTGTCTCTCCCTTATATCTTGAAGTTAATATTTCTGTGAAGAAGC 3 >SRR573705.2/1 4 CCACTTGTCCCAGTCTGTGCTGCCTGTACAATGGATTAGCTGAGGAAAACTGGCATCCCATGGCCTCAAACAGACGCAGCAAGTCCATGAAGCCATAATT > cat –n file2 | head -4 1 >SRR573705.1/2 2 TTTCTAACAATTGAATTAGCAACACAAACACTATTGACAAAGCTATATCTTATTTCTACTAAAGCTCGATAGGGTCTTCTCGTCCTGCGATCCCATTCCT 3 >SRR573705.2/2 4 GTATGATGGGTGTGTCAAGGAGCTCAACCATCGTGATAGGCTACCTCATGCATCGAGACAAGATCACATTTAATGAGGCATTTGACATGGTCAGGAAGCA 我的代码如下。 对于只包含几百条logging的小型testing文件来说,它效果很好。 但是,在读取包含数百万或logging的实际数据文件时,它将返回无意义的错误,例如: Inaccurate […]

当我期望的时候,Linux FIFO不会返回EOF

让我们考虑下面的Python代码,由Linux系统上的cpython执行(警告:它将尝试创build或覆盖/tmp/first , /tmp/second和/tmp/third )。 #!/usr/bin/env python2 # -*- coding: utf-8 -*- import subprocess import os import sys import threading class ThreadizedPopen(threading.Thread): def __init__(self, command, stdin_name, stdout_name): super(ThreadizedPopen, self).__init__() self.command = command self.stdin_name = stdin_name self.stdout_name = stdout_name self.returncode = None def run(self): with open(self.stdin_name, 'rb') as fin: with open(self.stdout_name, 'wb') as fout: popen = subprocess.Popen(self.command, […]

即使所有pipe道closures,程序仍然要input

我正试图实现这种情况: 叉子和pipe子情景 其中两个并行进程通过pipe道连接到tr /az/ /AZ/ ,最后tr /az/ /AZ/进程连接到stdout。 我写了这个程序,试图达到我的目标: #include<stdio.h> #include<unistd.h> #include<wait.h> int main() { int dummy; int fd[2]; int i; char* lsargs[] = {"/bin/ls", "-l", NULL}; char* lsargs2[] = {"cat", "/etc/group", NULL}; char* lsargs3[] = {"tr", "/az/", "/AZ/", NULL}; char** am[] = {lsargs, lsargs2, lsargs3}; pipe(fd); for ( i = 0 ; i < […]

Linux的munmap不工作(或至less不能立即工作)

我打电话munmap没有错误,但映射仍然visibe在/proc/<pid>/maps ,当我试图mmap(address_overlapping_with_what_I_tried_to_munmap, …)我没有得到我要求的地址。 这是一个错误或function? 有什么我可以做,以确保一些未映射? 详细信息:32位Linux 4.1.18 编辑 最初,地图条目是 bfe50000-bfe71000 rw-p 00000000 00:00 0 然后我使用参数0xbfe50000, 0x21000调用munmap 入口是 bfe50000-bfe50000 rw-p 00000000 00:00 0

在函数处理程序中直接使用写入函数的用户空间缓冲区(Linux,Kernel)保存内存?

我有一个Linux文件系统实现的function: ssize_t (*write) (struct file *file, const char __user *buffer, size_t count, loff_t *pos); 现在让我们说我想使用缓冲区的数据来计算奇偶校验(在函数处理中)。 我可以使用 copy_from_user(void *to, const void __user *from, unsigned long n) 但问题是我需要先为内核空间指针分配内存。 我想要复制的数据量是最大的。 大约7.5 MB和分钟。 512KB。 如果我使用kmalloc在内核中分配内存它可能会失败,我甚至不能分配足够的内存在前面的内存池,因为不知何故失败,… 所以:如果我只是在我的代码中使用用户空间的指针会发生什么? … *(dest) ^= *(buf); … 到目前为止,它似乎工作(虽然较小的内存区域)。 我不知道内存映射如何工作。 用户空间内存是不是连续的? 它可以被换出吗? 什么危险? 谢谢!