来自apue fig15.5 fig 15.6
#include "apue.h"
int
main(void)
{
int n;
int fd[2];
pid_t pid;
char line[MAXLINE];
if (pipe(fd) < 0)
err_sys("pipe error");
if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid > 0) { /* parent */
close(fd[0]);
write(fd[1], "hello world\n", 12);
} else { /* child */
close(fd[1]);
n = read(fd[0], line, MAXLINE);
write(STDOUT_FILENO, line, n);
}
exit(0);
}
调用/bin/more
#include "apue.h"
#include <sys/wait.h>
#define DEF_PAGER "/bin/more" /* default pager program */
int
main(int argc, char *argv[])
{
int n;
int fd[2];
pid_t pid;
char *pager, *argv0;
char line[MAXLINE];
FILE *fp;
if (argc != 2)
err_quit("usage: a.out <pathname>");
if ((fp = fopen(argv[1], "r")) == NULL)
err_sys("can't open %s", argv[1]);
if (pipe(fd) < 0)
err_sys("pipe error");
if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid > 0) { /* parent */
close(fd[0]); /* close read end */
/* parent copies argv[1] to pipe */
while (fgets(line, MAXLINE, fp) != NULL) {
n = strlen(line);
if (write(fd[1], line, n) != n)
err_sys("write error to pipe");
}
if (ferror(fp))
err_sys("fgets error");
close(fd[1]); /* close write end of pipe for reader */
if (waitpid(pid, NULL, 0) < 0)
err_sys("waitpid error");
exit(0);
} else { /* child */
close(fd[1]); /* close write end */
if (fd[0] != STDIN_FILENO) {
if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
err_sys("dup2 error to stdin");
close(fd[0]); /* don't need this after dup2 */
}
/* get arguments for execl() */
if ((pager = getenv("PAGER")) == NULL)
pager = DEF_PAGER;
if ((argv0 = strrchr(pager, '/')) != NULL)
argv0++; /* step past rightmost slash */
else
argv0 = pager; /* no slash in pager */
if (execl(pager, argv0, (char *)0) < 0)
err_sys("execl error for %s", pager);
}
exit(0);
}
popen和pclose函数 fig15.11
#include "apue.h"
#include <sys/wait.h>
#define PAGER "${PAGER:-more}" /* environment variable, or default */
int
main(int argc, char *argv[])
{
char line[MAXLINE];
FILE *fpin, *fpout;
if (argc != 2)
err_quit("usage: a.out <pathname>");
if ((fpin = fopen(argv[1], "r")) == NULL)
err_sys("can't open %s", argv[1]);
if ((fpout = popen(PAGER, "w")) == NULL)
err_sys("popen error");
/* copy argv[1] to pager */
while (fgets(line, MAXLINE, fpin) != NULL) {
if (fputs(line, fpout) == EOF)
err_sys("fputs error to pipe");
}
if (ferror(fpin))
err_sys("fgets error");
if (pclose(fpout) == -1)
err_sys("pclose error");
exit(0);
}
- 大小: 4.1 KB
分享到:
相关推荐
笔记_UNIX环境网络编程卷二进程间通信_中文第二版
在编程中,尤其是在多进程通信领域,通过管道(pipe)与子进程进行通信是一种常见的方法。这种方式允许父进程和子进程之间交换数据,而无需直接访问共享内存或使用其他复杂同步机制。以下是对该主题的详细说明: 1....
### 进程通信知识点概述 #### 一、进程通信概念及技术分类 进程通信是指不同进程之间进行数据交换和同步的技术。在Windows平台下,进程通信主要包括以下几种方式: 1. **消息(Message)** - 消息机制是基于Windows...
本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...
Linux 进程专题笔记 Linux 进程是操作系统对资源的一种抽象,一个进程由代码段、数据段、堆栈段和进程控制块(PCB)组成。进程控制块是操作系统感知进程存在的一个重要数据结构,通过进程控制块,操作系统可以控制...
本教程聚焦于MFC中的一个重要概念——进程间通信(Inter-Process Communication,IPC)。进程间通信允许不同的进程之间交换数据,共享资源,协同工作,是Windows编程中的关键技能。Lesson 17的MFC教程将深入探讨这一...
【linux学习笔记-13】基本进程通信--文件锁 【linux学习笔记-14】基本进程通信--信号 【linux学习笔记-15】基本进程通信--管道 【linux学习笔记-16】shell管道重定向程序的实现 【linux学习笔记--17】POSIX IPC——...
3. **System V IPC**:包括消息队列、信号量和共享内存,提供更强大的同步和通信功能,适用于大型系统内的进程通信。 4. **POSIX IPC**:与System V类似,但更强调可移植性,包括POSIX消息队列、信号量和共享内存。 ...
Java进程间通信(IPC,Inter-Process Communication)是多进程应用程序中实现不同进程间数据交换的方式。以下是对标题和描述中涉及的知识点的详细说明: 1. **管道(Pipe)**: 管道是一种半双工通信方式,允许...
总的来说,该读书笔记覆盖了操作系统设计中的核心知识点——进程间通信,深入解析了各种通信机制的工作原理和实现方式,对于操作系统爱好者和开发者来说,是一份非常宝贵的参考资料。通过学习和实践,我们可以提高在...
本阅读笔记将深入探讨Linux进程的创建、进程控制以及守护进程的实现。 首先,让我们了解一下Linux中的进程创建。在Linux中,最常用的创建新进程的方式是使用`fork()`系统调用。`fork()`会创建一个与父进程几乎完全...
6. 安全性:跨进程通信可能引入安全风险,如注入攻击。因此,理解和应用安全编程原则是必要的。 7. 示例代码与实践:理论知识结合实际编写代码,通过实例来加深理解,是学习的关键。可以从简单的进程创建开始,逐步...
操作系统复习笔记2——进程管理 操作系统中的进程管理是指操作系统对进程的创建、调度、同步和通信的管理。下面是关于进程管理的详细知识点: 1. 进程概念 进程是一个程序在执行时的实体。它包括进程控制块(PCB...
【linux学习笔记-13】基本进程通信--文件锁.doc 【linux学习笔记-14】基本进程通信--信号.doc 【linux学习笔记-15】基本进程通信--管道.doc 【linux学习笔记-16】shell管道重定向程序的实现.doc 【linux学习笔记-1】...
本文档主要涵盖了网络通信程序设计的课堂笔记和Linux实验代码,涉及到Linux系统、C语言编程、计算机网络、并发服务器、进程通信、Socket编程等领域。本文档将从Linux系统的基本命令、C语言编程入门、计算机网络的...
- **线程**:是进程中的执行单元,同一进程内的多个线程共享进程的地址空间和资源,这意味着线程间的通信更简单且快速。线程由轻量级进程(LWP)实现,也由内核管理和调度。 #### 创建进程:fork()与exec()系列函数...
在操作系统设计中,进程间通信(IPC,Inter-Process Communication)是至关重要的组成部分,它允许不同进程之间交换数据和同步状态。《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现...
在Linux操作系统中,进程是系统资源分配的基本单位。学习Linux的进程管理对于理解和操作系统的运行至关重要。本篇笔记主要探讨了以下几...在实际操作中,这些知识点可用于进程控制、进程通信、信号处理以及调试等场景。