Linux环境编程课件Linux环境编程8章节

上传人:E**** 文档编号:91236250 上传时间:2019-06-26 格式:PPT 页数:44 大小:233.50KB
返回 下载 相关 举报
Linux环境编程课件Linux环境编程8章节_第1页
第1页 / 共44页
Linux环境编程课件Linux环境编程8章节_第2页
第2页 / 共44页
Linux环境编程课件Linux环境编程8章节_第3页
第3页 / 共44页
Linux环境编程课件Linux环境编程8章节_第4页
第4页 / 共44页
Linux环境编程课件Linux环境编程8章节_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《Linux环境编程课件Linux环境编程8章节》由会员分享,可在线阅读,更多相关《Linux环境编程课件Linux环境编程8章节(44页珍藏版)》请在金锄头文库上搜索。

1、1,第8章,进程间通信,2,8.1 IPC简介,IPC是类UNIX系统中的一个专业术语。 进程间通信就是在不同进程之间传递或交换信息。需要一个不同进程都能访问的存放数据的 “公共场所”,即数据存放介质。 3类“公共场所” 进程的用户空间是互相独立的,但共享存储区可公用。 系统空间是公用,但是只有内核具有访问权限。 外设,两个进程可以通过磁盘上的普通文件、或者通过“注册表”(Windows系统)、或者通过第三方数据库进行信息的相互交换。,3,三种常用的IPC技术 管道 (普通)管道,有两个局限: 半双工,只能单向传送数据; 只能在同源进程(在进程创建上具有亲缘关系)间使用。 命名管道(FIFO)

2、,可以在不相关的进程之间进行通讯。 SysV IPC 三种类型: 消息队列、信号量和共享内存,它们在实现上具有很大的相似性。 最初在AT&T公司的System V.2 UNIX版本中引入。 套接字 主要用于网络通信,可以在不同主机的进程间相互交换信息。,8.1 IPC简介,4,pipe函数 可通过调用pipe函数来创建一个管道。,8.2 管道,#include int pipe(int filedes2);,filedes 用于返回文件描述符的数组。 返回值 成功时返回0; 出错时返回-1,并设置errno变量。 说明 filedes0为读而打开,filedes1为写而打开。filedes1

3、的输出将作为filedes0的输入。写入写端的数据将被内核缓存,直到从读端读出。 通常,调用pipe函数的进程会接着调用fork,以创建一个父进程与子进程之间的IPC通道。 fork之后有两个操作选择,这取决于所需建立的管道的数据流向。根据不同流向,在父子进程中要关闭相应端口。 在通信过程中的读、写规则: 当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,以指示到了文件结束处。 如果写一个读端已被关闭的管道,则产生SIGPIPE信号。如果忽略该信号或者捕获该信号并从其处理程序返回,则write出错返回,errno设置为EPIPE。 在写管道时,已写但尚未被读走的字节数应小于或

4、等于PIPE_BUF(4096B).,5,pipe函数 示例8-1 ex_pipe.c,Program 8-1 ex_pipe.c 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 int main(int argc, char *argv) 8 9 int pipefd2; 10 pid_t cpid; 11 char buf; 12 13 if (argc != 2) 14 fprintf(stderr, “Usage: %s n“, argv0); 15 exit(EXIT_FAILURE); 16 17 18 if (

5、pipe(pipefd) = -1) /* create pipe */ 19 perror(“pipe“); 20 exit(EXIT_FAILURE); 21 ,22 23 cpid = fork(); /* create child process */ 24 if (cpid = -1) 25 perror(“fork“); 26 exit(EXIT_FAILURE); 27 28 29 if (cpid = 0) /* read pipe in child */ 30 close(pipefd1); /* close write end */ 31 32 while (read(pi

6、pefd0, 44 45 ,jianglinmeiubuntu:/c$ gcc -o ex_pipe ex_pipe.c jianglinmeiubuntu:/c$ ./ex_pipe “this is a string from father“ this is a string from father,8.2 管道,6,popen和pcolse函数 这两函数用于实现:创建管道,fork子进程,然后关闭管道的不使用端,在子进程中exec一个shell以执行一条命令,然后等待命令的终止。,#include FILE *popen(const char *command, const char *

7、type); int pclose(FILE *stream);,command 将在子进程中执行的命令行字符串。 type 打开方式,应为“r“或“w“二者之一,含义与fopen的第 二个参数一样。 返回值 成功时,popen返回一个文件流指针,pclose返回command的终止状态。 出错时,popen返回NULL,pclose返回-1。 说明 函数popen先调用fork函数创建子进程,然后调用exec函数以执行command,最后返回一个标准I/O文件指针。 popen打开的文件流是全缓存的。 函数pclose关闭标准I/O流,并等待command命令执行结束,最后返回shell的终

8、止状态。 popen函数执行command的方式同system()函数,相当于在Shell下执行:“sh c command”。,8.2 管道,7,popen和pcolse函数 示例8-2 ex_popen_filter.c & 8-3 ex_popen.c,Program 8-2 ex_popen_filter.c 1 #include 2 #include 3 #include 4 5 int main(void) 6 7 int c; 8 while( (c = getchar() != EOF ) 9 if( isupper(c) ) 10 c = tolower(c); 11 if(

9、 putchar(c) = EOF ) 12 printf(“fail in putchar()!n“); 13 exit(-1); 14 15 if(c = n) 16 fflush(stdout); 17 18 exit(0); 19 ,Program 8-2 ex_popen.c 1 #include 2 #include 3 #include 4 5 int main(void) 6 7 char lineBUFSIZ; 8 FILE* fpRead; 9 10 if( (fpRead = popen(“./ex_popen_filter“, “r“) = NULL) 11 print

10、f(“Fail to call popen()!n“); 12 exit(-1); 13 14 15 for( ; ; ) 16 fputs(“PipeIn “, stdout); 17 fflush(stdout); 18 if( fgets(line, BUFSIZ, fpRead) = NULL ) /* read pipe */ 19 break; 20 if( fputs(line, stdout) = EOF ) 21 printf(“Fail to call fputs()!n“); 22 exit(-1); 23 24 25,26 if(pclose(fpRead) = -1)

11、 27 printf(“Fail to call pclose()!n“); 28 exit(-1); 29 30 31 putchar(n); 32 exit(0); 33 ,jianglinmeiubuntu:/c$ gcc -o ex_popen ex_popen.c jianglinmeiubuntu:/c$ ./ex_popen PipeIn Hello, world! hello, world! PipeIn Data from FILTER. data from filter. PipeIn note:press Ctrl + D,8.2 管道,8,先入先出队列(First In

12、 First Out Queue) FIFO也是一种文件类型。FIFO的路径名存在于文件系统中,创建命名管道类似于创建文件。 可调用mkfifo函数来创建一个命名管道。,8.3 命名管道(FIFO),#include #include int mkfifo(const char *pathname, mode_t mode);,pathname 要打开或创建的文件的名字。 mode 存取访问权限,同open函数的mode参数。 返回值 成功时返回0,出错时返回-1并设置errno。 说明 新创建的FIFO文件的所有者是当前进程的有效用户,文件的所属组是当前进程的有效组或父目录的所属组。 一旦用

13、mkfifo创建了一个FIFO文件,就可用系统I/O调用(close, read, write, unlink, etc.) 来操作它。 未指定O_NONBLOCK时,以读方式打开FIFO将阻塞到某个其他进程以写方式打开该FIFO。反之,以写方式打开FIFO将阻塞到某个其他进程以读方式打开它。 指定了O_NONBLOCK,则以读方式打开FIFO会立即返回。但是,以写的方式打开没有读端的FIFO将以失败返回,并设置errno为ENXIO。,9,示例8-4 ex_fifo.c & 8-5 ex_fifo_writer.c,Program 8-4 ex_fifo.c 1 #include 2 #in

14、clude 3 #include 4 #include 5 #include 6 #include 7 8 int main(void) 9 10 int fd; 11 char buf; 12 char *fifofile = “/tmp/myfifo1234“; 13 14 if(access(fifofile, F_OK) != 0) /* file doesnt exist */ 15 if(mkfifo(fifofile, 0744) = -1) /* create FIFO */ 16 printf(“Fail to create fifo.n“); 17 exit(EXIT_FA

15、ILURE); 18 19 20 21 if( (fd = open(fifofile, O_RDONLY) = -1) 22 printf(“Fail to open fifo.n“); 23 exit(EXIT_FAILURE); 24 ,25 26 while (read(fd, 33 ,8.3 命名管道(FIFO),10,示例8-4 ex_fifo.c & 8-5 ex_fifo_writer.c,Program 8-5 ex_fifo_writer.c 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 int main(int argc, char* argv) 10 11 int fd; 12 char *fifofile = “/tmp/myfifo1234“; 13 14 if (argc

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号