`
frenchleaf
  • 浏览: 39751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

进程通信笔记

阅读更多
来自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环境网络编程卷二进程间通信_中文第二版.pdf

    笔记_UNIX环境网络编程卷二进程间通信_中文第二版

    编程高手 笔记 通过管道与子进程通信

    在编程中,尤其是在多进程通信领域,通过管道(pipe)与子进程进行通信是一种常见的方法。这种方式允许父进程和子进程之间交换数据,而无需直接访问共享内存或使用其他复杂同步机制。以下是对该主题的详细说明: 1....

    VC学习笔记之二:进程通信.doc

    ### 进程通信知识点概述 #### 一、进程通信概念及技术分类 进程通信是指不同进程之间进行数据交换和同步的技术。在Windows平台下,进程通信主要包括以下几种方式: 1. **消息(Message)** - 消息机制是基于Windows...

    学习笔记信号量和进程间通信

    本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...

    linux进程专题笔记.docx

    Linux 进程专题笔记 Linux 进程是操作系统对资源的一种抽象,一个进程由代码段、数据段、堆栈段和进程控制块(PCB)组成。进程控制块是操作系统感知进程存在的一个重要数据结构,通过进程控制块,操作系统可以控制...

    MFC教程lesson 17-进程间通信.rar

    本教程聚焦于MFC中的一个重要概念——进程间通信(Inter-Process Communication,IPC)。进程间通信允许不同的进程之间交换数据,共享资源,协同工作,是Windows编程中的关键技能。Lesson 17的MFC教程将深入探讨这一...

    非常宝贵的LINUX学习笔记

    【linux学习笔记-13】基本进程通信--文件锁 【linux学习笔记-14】基本进程通信--信号 【linux学习笔记-15】基本进程通信--管道 【linux学习笔记-16】shell管道重定向程序的实现 【linux学习笔记--17】POSIX IPC——...

    linux进程间通讯笔记.docx

    3. **System V IPC**:包括消息队列、信号量和共享内存,提供更强大的同步和通信功能,适用于大型系统内的进程通信。 4. **POSIX IPC**:与System V类似,但更强调可移植性,包括POSIX消息队列、信号量和共享内存。 ...

    java进程间通讯笔记

    Java进程间通信(IPC,Inter-Process Communication)是多进程应用程序中实现不同进程间数据交换的方式。以下是对标题和描述中涉及的知识点的详细说明: 1. **管道(Pipe)**: 管道是一种半双工通信方式,允许...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十四)进程间通信(二)文章代码

    总的来说,该读书笔记覆盖了操作系统设计中的核心知识点——进程间通信,深入解析了各种通信机制的工作原理和实现方式,对于操作系统爱好者和开发者来说,是一份非常宝贵的参考资料。通过学习和实践,我们可以提高在...

    linux 进程控制阅读笔记

    本阅读笔记将深入探讨Linux进程的创建、进程控制以及守护进程的实现。 首先,让我们了解一下Linux中的进程创建。在Linux中,最常用的创建新进程的方式是使用`fork()`系统调用。`fork()`会创建一个与父进程几乎完全...

    跨进程自学资料与笔记

    6. 安全性:跨进程通信可能引入安全风险,如注入攻击。因此,理解和应用安全编程原则是必要的。 7. 示例代码与实践:理论知识结合实际编写代码,通过实例来加深理解,是学习的关键。可以从简单的进程创建开始,逐步...

    操作系统复习笔记2——进程管理

    操作系统复习笔记2——进程管理 操作系统中的进程管理是指操作系统对进程的创建、调度、同步和通信的管理。下面是关于进程管理的详细知识点: 1. 进程概念 进程是一个程序在执行时的实体。它包括进程控制块(PCB...

    Linux学习笔记Linux学习资料Linux教程

    【linux学习笔记-13】基本进程通信--文件锁.doc 【linux学习笔记-14】基本进程通信--信号.doc 【linux学习笔记-15】基本进程通信--管道.doc 【linux学习笔记-16】shell管道重定向程序的实现.doc 【linux学习笔记-1】...

    网络通信程序设计课堂笔记与Linux实验代码

    本文档主要涵盖了网络通信程序设计的课堂笔记和Linux实验代码,涉及到Linux系统、C语言编程、计算机网络、并发服务器、进程通信、Socket编程等领域。本文档将从Linux系统的基本命令、C语言编程入门、计算机网络的...

    Linux 进程 线程学习笔记

    - **线程**:是进程中的执行单元,同一进程内的多个线程共享进程的地址空间和资源,这意味着线程间的通信更简单且快速。线程由轻量级进程(LWP)实现,也由内核管理和调度。 #### 创建进程:fork()与exec()系列函数...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十五)进程间通信(三)文章代码

    在操作系统设计中,进程间通信(IPC,Inter-Process Communication)是至关重要的组成部分,它允许不同进程之间交换数据和同步状态。《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现...

    linux学习笔记:进程

    在Linux操作系统中,进程是系统资源分配的基本单位。学习Linux的进程管理对于理解和操作系统的运行至关重要。本篇笔记主要探讨了以下几...在实际操作中,这些知识点可用于进程控制、进程通信、信号处理以及调试等场景。

Global site tag (gtag.js) - Google Analytics