Articles of pipe理员

Bash oneliner与pipe道,如果条件给出错误

我试图find一个特定的进程在bash使用if条件的数量 if ps auwx | grep -v grep | grep -ic python -le 2; then echo error; else echo no_error; fi 我正在得到输出 grep: python: No such file or directory NO_ERROR 如果我使用pipe道,单线程似乎中断,如果省略pipe道,则不会抛出错误,如果使用grep的绝对path也无关紧要。如果没有pipe道,我将无法获得所需的结果。 我在这里做错了什么? 我可以在一个脚本文件中完成这个工作,将其分解成variables,然后进行比较,但是我将它作为练习来学习bash。 任何帮助是极大的赞赏。

当通过POSIXpipe道接收input并输出到POSIXpipe道时,grep的行为是什么?

我有这个程序,为这个孩子的stdin,stdout和stderr分叉并创build了三个POSIXpipe道。 分叉之后,子对象和父对象将closures其各自pipe道的适当的末端,使得子对象只能从标准inputpipe道中读取,并只写入标准输出和标准错误pipe道(而父对象是相反的)。 接下来,subprocessclosures并将孩子的stdin,stdout和stderr映射到打开的pipe道端,然后使用execvp执行名称作为父进程的参数传入的程序。 程序的行为应该像cat,ls,rm,banner和ps这样的命令,而没有任何明显的问题。 但是,当我在terminal上运行程序时,像这样: 程序grep等等 它需要input,但不输出任何东西到terminal,但是当我尝试: grep等等 在terminalgrep等待input,并打印出来,如果input包含单词“等”。 所以问题是,这是因为我的程序出现了什么问题,如下所示? 或者,当它通过POSIXpipe道进行通信时,grep的行为是正常的吗? 感谢您的阅读。 这是有问题的程序(请原谅格式化第一次张贴): #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> #include <limits.h> int status, cpid; int child = 1; char mode = 'c'; sigset_t sigMask; void childHandler(){ sigprocmask(SIG_BLOCK,&sigMask,NULL); int i = waitpid(-1,&status,WNOHANG); if(i){ fprintf(stderr, "The child <%d> has terminated with […]

Unix – 保护你自己的内存消耗失控打破个人电脑?

.net Windows环境要求非常类似的问题: 你如何保护自己免受内存消耗失控打破个人电脑? 这个问题是针对使用C或C ++的Unix环境提出的。 举一个例子,考虑下面的危险小块: #include <vector> int main() { int n; std::vector<double> A(n); } 如果幸运的话,代码将会引发一个范围错误。 如果你不幸(在我的情况下,内存的价值是283740392),代码将快速使用所有可用的RAM,并导致大规模的交换到磁盘,使操作系统虚拟停顿更快,然后可以被杀死。 当然,这个进程总是可以被终止,但是可能需要几分钟的时间才能恢复,因为所有其他正在运行的进程都必须重新加载到内存中。 这不是一个问题的答案意味着缺乏内存,人们可以很容易地让一个失控的过程,沼泽任何可用的机器。

subprocess拷贝整个数组吗?

我正在编写一个基本的UNIX程序,它涉及相互发送消息的进程。 我同意进程的想法是简单地有一个标志数组来指示进程是否已经到达代码中的某个点。 例如,我希望所有进程都等待,直到它们全部被创build。 我也希望他们在开始阅读他们的pipe道之前等到他们完成了彼此的消息发送。 我知道一个进程在写入一个以前定义的variables时执行写入时复制操作。 我想知道的是,如果我做了一个标志数组,将指向该数组的指针复制,或者将整个数组复制(从而使我的想法无用)。 我还想要关于进程间通信和进程同步的任何提示。 编辑:进程正在写入对方的过程'pipe道。 每个进程将发送以下信息: typedef struct MessageCDT{ pid_t destination; pid_t source; int num; } Message; 所以,只是消息的来源和一些随机数。 然后每个进程将输出消息到标准输出:沿着“进程20接收来自进程3的5724244”的行。

死锁的Linuxpipe道

我想了解Linuxpipe道如何工作! 我写了一个小而简单的程序,它使用pipe道在父进程和subprocess之间传递string。 但是,程序导致死锁,我不明白是什么原因。 这里是代码: #include <sys/wait.h> #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define SIZE 100 int main(int argc, char *argv[]) { int pfd[2]; int read_pipe=0, write_pipe=0; pid_t cpid; char buf[SIZE]; /* PIPE *************************************** * pipe() creates a pair of file descriptors, * * pointing to a pipe inode, and places them […]

如何在qsub命令中使用pipe道或redirect?

有一些命令我想使用需要使用pipe道( | )或redirect( > )的qsub(SGE 8.1.3,CentOS 5.9)在网格上运行。 例如,假设我必须并行化该命令 echo 'hello world' > hello.txt (显然是一个简单的例子:实际上我可能需要将程序的输出直接redirect到samtools )。 如果我做到了: qsub echo 'hello world' > hello.txt 结果hello.txt内容看起来像 Your job 123454321 ("echo") has been submitted 同样,如果我使用了一个pipe道( echo "hello world" | myprogram ),那么这个消息就会被传递给myprogram ,而不是实际的stdout。 我知道我可以编写一个小的bash脚本,每个脚本都包含带有pipe道/redirect的命令,然后执行qsub ./myscript.sh 。 不过,我正在尝试使用脚本同时运行多个并行作业,所以我必须编写许多这样的bash脚本,每个脚本的命令略有不同。 当这个解决scheme的脚本可以开始感到非常黑客。 Python中这样一个脚本的例子: for i, (infile1, infile2, outfile) in enumerate(files): command = ("bowtie -S […]

内存分配如何在极端情况下工作?

我很困惑如何内存分配(malloc / calloc)在linux / c工程。 假设,我有一台16GB RAM的机器,并以root身份运行一个程序。 这是64位的机器,所以所有的16GB可以作为一个单一的网段。 我可以用一个malloc调用来分配所有这些(less于OS的数量)吗? 有很多malloc调用? 这与“堆内存”和“虚拟内存”有什么关系? 如果我分配一个小内存块,它发生在堆内存,然后我调整(放大)这个块,当我接近堆栈区时会发生什么? 如果我想(几乎)所有的内存分配给我的单个进程,甚至认为它是以root身份运行的,我是否必须摆弄selimlimit RLIMIT_AS?

如何使pipe道顺序运行

眼镜 不要认为这应该有所作为,但我会包括它 GNU bash,版本3.2.51 前提 所以说我有一个pipe道有多个部分,我怎样才能防止部分pipe道在前一部分完成之前运行。 例 在下面的例子中,我将尝试显示这个问题 $ echo hello | tee /dev/tty | (echo "Next";sed 's/h/m/' ) 产量 Next hello mello 用睡觉来表明这是closures的时机 $ echo hello | tee /dev/tty | (sleep 2;echo "Next";sed 's/h/m/' ) 产量 hello Next mello 预期产出 如上所述 hello Next mello 但显然这取决于睡眠时间比以前的命令完成这是不是我想要的时间。 笔记 我知道有更好的方法来做到这一点,但我认为这对我来说是清楚地知道pipe道是如何工作的。 试着 尝试了等待和睡眠的变化,但没有一贯工作。 l0b0的build议 虽然这仍然打印下一个 $ echo hello […]

非阻塞在pipe道上读取

人们可以在pipe道上进行非阻塞I / O吗? fcntl无法设置O_NONBLOCK。 Linux编程接口的页面918包括一个表“从pipe道或FIFO(p)读取n个字节的语义”。 该表列出了一列标题为O_NONBLOCK的pipe道和FIFO的行为? 这意味着你可以在pipe道上设置O_NONBLOCK标志。 它是否正确? 下面的代码无法设置标志,fcntl(2)虽然不报告错误。 #include <fcntl.h> #include <sys/wait.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #define SLEEP 1 int main(int argc, char *argv[]) { pid_t childPid; int pfd[2]; int nread, flags; int c = 'a'; setbuf(stdout, NULL); if (pipe(pfd) == -1) { printf("error: pipe"); exit(EXIT_FAILURE); } switch (childPid = fork()) { […]

FIFO(命名pipe道)消息传递障碍

我打算使用Unix命名pipe道(mkfifo)进行简单的多进程消息传递。 一条消息将只是一行文本。 你会劝阻我吗? 我应该期待什么障碍? 我注意到了这些限制: 收到消息之前,发件人无法继续。 一个接收器被阻塞,直到有一些数据。 当我们需要停止阅读时,需要非阻塞IO。 例如,另一个线程可以要求。 接收器可以在一次读取中获得许多消息。 这些必须在退出前处理。 primefaces消息的最大长度受限于4096个字节。 这是Linux上的PIPE_BUF限制(请参阅man 7 pipe)。 我将在Python中实现消息传递。 但是障碍总的来说是成立的。