电子商务网站建设与管理教材,百度优化是什么,北京房子,wordpress主题dux5.2晚上好#xff0c;继续记录我的学习心得。当你厌倦了自己的目标时#xff0c;怎样继续保持专注#xff1f;误区#xff1a;成功人士说的都是自己如何“满怀热情”去努力实现他们的目标。不管是在商业、体育还是艺术界#xff0c;我们听到的都是“一切都归结于激情”或者“… 晚上好继续记录我的学习心得。当你厌倦了自己的目标时怎样继续保持专注误区成功人士说的都是自己如何“满怀热情”去努力实现他们的目标。不管是在商业、体育还是艺术界我们听到的都是“一切都归结于激情”或者“你必须真的渴望得到它”之类的说法。这让我们认为成功人士会有无限的激情如果我们感到自己激情消退了仿佛说明了我们不如他们这让人很沮丧。事实是他们没把话说完整。成功人士也会和普通人一样感到激情消退这是任何人都无法逃脱的。熟能生巧。你练习的次数越多它就变得越无聊越像是机械地重复。成功的最大威胁不是失败而是倦怠。我们厌倦了好习惯因为它们不再让我们开心。就好像写作一样长期来看会给我带来好的结果但是总会有那么几天我也会感觉写作是枯燥的。成功人士更强大的地方在于尽管感到枯燥乏味他们仍想办法坚持下去。对抗枯燥感的小技巧在开始做自己不不想做的事情时: 先一边听音乐一边干15分钟后再摘下耳机。必须控制时间因为听得越多音乐给你带来的满足感就会越少。以下是正文先明确一下正文的目的举例说明 Linux 下父子进程如何使用管道进行通讯。目录一、概述- 1. IPC 工具分类- 2. 什么是管道- 3. 管道的 2 个局限性- 4. 管道是最常用的 IPC- 5. 使用 pipe() 创建管道二、一个简单的例子 (simple_pipe.c)- 1. 代码分析- 2. 相关要点三、参考书籍四、欢迎加入我的微信群
一、概述1. IPC 工具分类通信类 (communication)这类工具关注进程之间的数据交换。同步类 (synchronization)这类工具关注进程和线程操作之间的同步。信号类 (signal)尽管信号的主要作用并不在此但在特定场景下仍然可以将它作为一种同步技术。更罕见的是信号还可以作为一种通信技术信号编号本身是一种形式的信息并且可以在实时信号上绑定数据。2. 什么是管道当从一个进程连接数据流到另一个进程时我们使用术语管道 (pipe)也叫无名管道 (unnamed pipe)。通常是把一个进程的输出通过管道连接到另一个进程的输入。管道是 UNIX 系统最古老的 IPC 所有 UNIX 系统都提供这种通信机制。3. 管道的 2 个局限性历史上它是半双工的 (即数据只能在一个方向上流动)。现在某些系统提供全双工管道但是为了可移植性我们不应预先假定系统支持全双工管道。管道只能在具有公共祖先的两个进程之间使用。通常一个管道由一个进程创建在进程调用 fork 之后这个管道就能在父进程和子进程之间使用了。4. 尽管有这 2 个局限性半双工管道仍是最常用的 IPC每当在管道中键入一个命令序列让 shell 执行时shell 都会为每一条命令单独创建一个进程然后用管道将前一条命令进程的标准输出与后一条命令的标准输入相连接。shell 负责安排两个命令的标准输入和标准输出cmd1 的标准输入来自终端键盘;cmd1 的标准输出传递给 cmd2作为它的标准输入;cmd2 的标准输出连接到终端屏幕;shell 所做的工作实际上是对标准输入和标准输出流进行了重新连接使数据流从键盘输入通过两个命令最终输出到屏幕上。以 $ ls | wc -l 为例5. 使用 pipe() 创建管道$ man 2 pipe
NAMEpipe, pipe2 - create pipe
SYNOPSIS#include unistd.hint pipe(int filedes[2]);
成功的 pipe() 调用会在数组 filedes 中返回两个打开的文件描述符一个表示管道的读取端 (filedes[0])另一个表示管道的写入端 (filedes[1])。与所有文件描述符一样可以使用 read() 和 write() 在管道上执行 I/O 操作。一旦向管道的写入端写入数据之后立即就能从管道的读取端读取数据。二、一个简单的例子 (simple_pipe.c)1. 代码分析下面的程序演示了如何将管道用于父进程和子进程之间的通信int main(int argc, char *argv[])
{int pfd[2];char buf[BUF_SIZE];ssize_t numRead;if (argc ! 2 || strcmp(argv[1], --help) 0)usageErr(%s string\n, argv[0]);if (pipe(pfd) -1) /* Create the pipe */errExit(pipe);switch (fork()) {case -1:errExit(fork);case 0: /* Child - reads from pipe */if (close(pfd[1]) -1) /* Write end is unused */errExit(close - child);for (;;) { /* Read data from pipe, echo on stdout */numRead read(pfd[0], buf, BUF_SIZE);if (numRead -1)errExit(read);if (numRead 0)break; /* End-of-file */if (write(STDOUT_FILENO, buf, numRead) ! numRead)fatal(child - partial/failed write);}// cleanup...default: /* Parent - writes to pipe */if (close(pfd[0]) -1) /* Read end is unused */errExit(close - parent);if (write(pfd[1], argv[1], strlen(argv[1])) ! strlen(argv[1]))fatal(parent - partial/failed write);if (close(pfd[1]) -1) /* Child will see EOF */errExit(close);wait(NULL); /* Wait for child to finish */exit(EXIT_SUCCESS);}
}
运行效果$ ./simple_pipe msg from parent
msg from parent
单个进程中的管道几乎没有任何用处。一般来讲都是使用管道让两个进程进行通信。为了让两个进程通过管道进行连接在调用完 pipe() 之后可以调用 fork()子进程会继承父进程的文件描述符的副本虽然父进程和子进程都可以从管道中读取和写入数据但一般不这么使用管道。通常在 fork() 之后其中一个进程应该立即关闭管道的写入端的描述符另一个则应该关闭读取端的描述符。在上面的例子中父进程向子进程传输数据所以它关闭了管道的读取端的描述符 filedes[0]而子进程则关闭管道的写入端的描述符 filedes[1]2. 相关要点父子进程从同一个管道中读取和写入数据这种做法不好的原因是如果两个进程同时试图从管道中读取数据那么就无法确定哪个进程会首先读取成功——两个进程竞争数据了即会产生竞争。使用管道进行双向通信更加简单的方法是创建两个管道在两个进程之间发送数据的两个方向上各使用一个。管道可以用于任意两个或更多相关进程之间的通信只要在创建子进程的系列 fork() 调用之前通过一个共同的祖先进程创建管道即可。关闭未使用管道文件描述符对于正确使用管道非常重要的当 read 一个写入端 (write end) 已被关闭的管道时在所有数据都被读取后read 会返回 0这时读取进程就知道文件已结束了。如果读取进程没有关闭管道的写入端那么在其他进程关闭了写入描述符之后读取进程也不会看到文件结束即使它读完了管道中的所有数据。当 write 一个读取端已被关闭的管道内核会向写入进程发送一个SIGPIPE 信号。在默认情况下这个信号会杀死进程。但进程可以捕获或忽略该信号这时管道上的 write() 操作因 EPIPE 错误而失败。收到SIGPIPE 信号 和获得 EPIPE 错误对于可以起到标示管道状态的作用。在写管道时常量 PIPE_BUF 规定了内核的管道缓冲区大小。如果对管道调用 write()而且要求写的字节数小于等于 PIPE_BUF则此操作不会与其他进程对同一管道的 write 操作交叉进行。如果有多个进程同时写一个管道且要求写入的字节数超过 PIPE_BUF则所写的数据可能会与其他进程所写的数据交错在一起。三、相关参考《UNIX 环境高级编程 - 15.2 管道》《Linux / UNIX 系统编程手册 - 44.管道和FIFO》《Linux 程序设计 - 13.进程间通信管道》《UNIX-Linux编程实践教程 - 10.I/O 重定向和管道》更多值得学习的知识点将管道作为一种进程同步的方法;使用管道连接过滤器;通过管道与 shell 命令进行通信popen();管道和 stdio 缓冲;命名管道FIFO; ...鉴于大多数人的注意力无法在一篇文章里上集中太久更多的内容请大家自行去阅读吧不是自己理解到的东西是消化不了的。有机会的话我会把更多的读书心得放在后面的文章。你和我各有一个苹果如果我们交换苹果的话我们还是只有一个苹果。但当你和我各有一个想法我们交换想法的话我们就都有两个想法了。如果你也对 嵌入式系统和开源软件 感兴趣并且想和更多人互相交流学习的话请关注我的公众号嵌入式 Hacker一起来学习吧无论是 关注或转发 , 还是赏赐都是对作者莫大的支持感谢 各位的大拇指「在看」 ,祝工作顺利家庭和睦~ 推荐阅读 专辑|Linux文章汇总 专辑|程序人生 专辑|C语言嵌入式Linux微信扫描二维码关注我的公众号