首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

历程通信笔记

2012-07-04 
进程通信笔记来自apuefig15.5 fig 15.6#include apue.hintmain(void){intnintfd[2]pid_tpidcharline[

进程通信笔记
来自apue  fig15.5 fig 15.6

#include "apue.h"intmain(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>#defineDEF_PAGER"/bin/more"/* default pager program */intmain(int argc, char *argv[]){intn;intfd[2];pid_tpid;char*pager, *argv0;charline[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 */elseargv0 = 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 */intmain(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);}

热点排行