作为评论,我很困惑为什么 makefile 中的“| true”与“|| true”用户cjm写道具有相同的效果:
另一个要避免的原因
| true是,如果命令产生足够的输出来填满管道缓冲区,它将阻塞等待 true 读取它。
我们是否有办法找出管道缓冲区的大小?
我有两个简单的程序:A和B.? A将首先运行,然后B获取“stdout”A并将其用作“stdin”。?假设我使用的是 GNU/Linux 操作系统,最简单的方法是:
./A | ./B
Run Code Online (Sandbox Code Playgroud)
如果我必须描述这个命令,我会说它是一个从生产者 ( A)获取输入(即读取)并写入消费者 ( B) 的命令。?这是一个正确的描述吗?我错过了什么吗?
FIFO(命名管道)与常规管道 (|) 有何不同?正如我从Wikipedia了解到的,与常规管道不同,FIFO 管道在进程结束后“继续存在”,并且可以在之后的某个时间删除。
但是如果进程基于包含管道 ( cat x | grep y)的 shell 命令,如果我们将其存储在变量或文件中,我们可以“在进程之后保持活动状态”,那不就是一个 FIFO 吗?
此外,常规管道也具有它获得的第一个标准输出,作为另一个命令的标准输入,所以它不也是一种先进先出管道吗?
我在 nfs 挂载上有一个目录,它在服务器上位于 /home/myname/.rubies
Root 无法访问此目录:
[mitchell.usher@server ~]$ stat /home/mitchell.usher/.rubies
File: `/home/mitchell.usher/.rubies'
Size: 4096 Blocks: 8 IO Block: 32768 directory
Device: 15h/21d Inode: 245910 Links: 3
Access: (0755/drwxr-xr-x) Uid: ( 970/mitchell.usher) Gid: ( 100/ users)
Access: 2016-08-22 15:06:15.000000000 +0000
Modify: 2016-08-22 14:55:00.000000000 +0000
Change: 2016-08-22 14:55:00.000000000 +0000
[mitchell.usher@server ~]$ sudo !!
sudo stat /home/mitchell.usher/.rubies
stat: cannot stat `/home/mitchell.usher/.rubies': Permission denied
Run Code Online (Sandbox Code Playgroud)
我试图从该目录中复制一些/opt只有 root 有权访问的内容:
[mitchell.usher@server ~]$ cp .rubies/ruby-2.1.3/ -r /opt
cp: cannot create directory `/opt/ruby-2.1.3': Permission denied
[mitchell.usher@server ~]$ …Run Code Online (Sandbox Code Playgroud) 在学习(或多或少)一些关于管道的有用讨论后,例如 获取通过管道传输到另一个进程的进程的退出状态和当管道中的一个进程失败时退出,我仍然无法避免在第一个命令失败时启动第二个命令。我是否缺少有关管道的基本细节?
所以例如
$ somecommand | tar -T - -czf /tmp/someProject.tar.gz
Run Code Online (Sandbox Code Playgroud)
tar.gz如果somecommand不能正常工作并且只产生一些错误消息而不是预期的文件列表,则不应创建几乎为空的文件。
> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep\0urandom\0", 2047) = 22
>
Run Code Online (Sandbox Code Playgroud)
为什么“w”需要urandom?如何避免这种情况?
更新:
> strace w 2>&1 | awk '/urandom/'
read(4, "awk\0/urandom/\0", 2047) = 14
>
Run Code Online (Sandbox Code Playgroud)
那么过滤与urandom有关吗?
> strace who 2>&1 | grep urandom
>
Run Code Online (Sandbox Code Playgroud)
那么为什么“谁”没有受到影响呢?
我现在正在做作业以介绍操作系统,我玩得很开心,但同时也很困惑。我现在正在做管道工作;我的代码如下。
最初,我的代码如下所示:
// Child process - write
if (fork() == 0) {
fprintf(stderr, "Child\r\n");
close(1);
dup(p[1]);
close(p[0]);
close(p[1]);
runcmd(pcmd->left);
// Parent process - read
} else {
wait(0);
close(0);
dup(p[0]);
close(p[0]);
close(p[1]);
fprintf(stderr, "Parent\r\n");
runcmd(pcmd->right);
}
Run Code Online (Sandbox Code Playgroud)
我对此的思考过程是,父母会等到孩子被终止,然后从管道中读取,就是这样。我在我们的讨论页面上将此代码发布给了我的导师,他告诉我代码存在几个问题,其中之一是:
He mentioned that the correct implementation therefore (in regards to wc), would be to use a blocking read command, which would wait on the pipe until data was available, and then begin reading until the pipe has closed.
I tried looking …
我最近读到,在 UNIX 版本 3 之前没有出现管道的概念。
但是,由于 UNIX 总是关于简单的程序,它们只做一件事,然后组合起来做更复杂的事情:他们是如何在没有管道的情况下做到这一点的?
当我检查某个进程时,我通常会写
ps aux | grep myprocess
Run Code Online (Sandbox Code Playgroud)
而有时我得到的输出
eimantas 11998 0.0 0.0 8816 740 pts/0 S+ 07:45 0:00 grep myprocess
Run Code Online (Sandbox Code Playgroud)
如果进程没有运行。
现在我真的想知道如果 grep 在运行后过滤掉ps命令的输出,为什么它会在进程列表中? ps
在诸如这样的管道中command1 | command2,
当我听说命令的进程形成一个进程组时,我的问题就出现了。如果它们没有相同的生命周期,那么命令进程的进程组是不是毫无意义?
我跑ps -ejH | less。输出也包括ps和less。
是什么原因?我认为它会按如下方式工作:
ps将运行,它将列出当时存在的所有进程。ps将被送入less。但是按照这个逻辑,两者psnot 都不less应该出现在ps.
那么,为什么这些进程包含在 的输出中ps?ps工作方式是否与我描述的有所不同?
假设您想要抓取一个非常大的文件的内容,但想要一次查看一些内容。假设一个人要执行以下操作:
$ cat /dev/sda1 | less
Run Code Online (Sandbox Code Playgroud)
作为 Java 和 ActionScript 等语言的程序员,当我查看这些代码时,我想象 Bash 首先运行命令cat /dev/sda1(将命令返回的所有内容加载到 RAM 中),然后运行less可以访问那个非常大的“伪变量”的命令”表示为-。
这是 Bash 做事的方式吗(意味着如果文件大于系统上的 RAM 量,该命令是一个非常糟糕的主意,您应该使用另一个命令),或者它是否有优化大型管道的方法?数据量?
ps aux | grep firefox
Run Code Online (Sandbox Code Playgroud)
列出所有具有字符串“firefox”的进程
ps aux | grep -v firefox
Run Code Online (Sandbox Code Playgroud)
列出没有字符串“firefox”的所有进程
ps aux | grep -v grep | grep firefox ?
第二个 grep 有什么作用?grep 本身就是一个命令,那么为什么我们要 grep 另一个 grep 呢?