课件资源等6进程间通信ipcv_第1页
课件资源等6进程间通信ipcv_第2页
课件资源等6进程间通信ipcv_第3页
课件资源等6进程间通信ipcv_第4页
课件资源等6进程间通信ipcv_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LinuxLinux进程间通信进程间通信讲师:朱景尧C语言语言C+语言语言 传智播客传智播客 高薪就业高薪就业ContentsContents无名管道无名管道 有名管道有名管道共享内存共享内存 123共享库共享库so 第一章第一章 无名管道无名管道u无名管道u无名管道是半双工的,就是对于一个管道来讲,只能读,或者写。u无名管道只能在相关的、有共同祖先的进程间使用。u一个fork或者exec调用创建的子进程继承了父进程的文件描述符。第一章第一章 无名管道无名管道u打开和关闭管道。uint pipe(int filedes2);u在你从一个管道中读出或者写入数据,这个管道必须存在。u如果成功建立了

2、管道,则会打开两个文件描述符,并把它们的值保存在一个整数数组中。u第一个文件描述符用于读取数据,第二个文件描述符用于写入数据。u如果出错返回-1,同时设置errnou关闭一个管道用close()函数第一章第一章 无名管道无名管道u读写管道。u读写管道与读写普通文件方式一样,调用write与read函数即可。u几乎不会在一个进程中打开一个管道仅供进程自己使用,管道是用来交换数据的。u因为一个进程已经能够访问它要通过管道共享的数据,和自己共享数据是没有意义的。u试图对一个管道的两端进行读写操作是一个严重的错误。第一章第一章 无名管道无名管道u读写无名管道的例子。int main(int arg,

3、char * args)int fd2;char buf100;int len;pipe(fd);memset(buf, 0, sizeof(buf);int pid = fork();if (pid = 0)close(fd1);while(len = read(fd0, buf, sizeof(buf) 0)write(STDOUT_FILENO, buf, len);close(fd0);elseclose(fd0);strcpy(buf, hello worldn);write(fd1, buf, sizeof(buf);close(fd1);waitpid(pid, NULL, 0)

4、;return 0;ContentsContents无名管道无名管道 有名管道有名管道共享内存共享内存 123共享库共享库so 第二章第二章 有名管道有名管道u有名管道(FIFO)。u有名管道是持久稳定的。u它们存在于文件系统中。uFIFO比无名管道作用更大,因为它们能让无关联的进程之间交换数据。u一个shell命令可以建立有名管道umkfifo option nameumkfifo创建一个名为name的有名管道第二章第二章 有名管道有名管道umkfifo fifo1。u创建一个有名管道fifo1。ucat fifo1。u将ls命令输出的结果写入fifo1中第二章第二章 有名管道有名管道u创建

5、fifo。uint mkfifo(const char *pathname, mode_t mode)u函数执行成功返回0,否则返回-1,并设置变量errno。第二章第二章 有名管道有名管道umkfifo函数例子。u八进制数0666转化为二进制后为110110110,代表读写权限为rw-rw-rw-int main(int arg, char *args)mkfifo(fifo1, 0666);return 0;第二章第二章 有名管道有名管道u删除fifo。uint unlink(const char *pathname);u函数执行成功返回0,否则返回-1,并设置变量errno。第二章第二章

6、 有名管道有名管道uunlink函数例子。int main(int arg, char * args)int i = unlink(fifo1);if (i = -1)printf(strerror(errno);return 0;第二章第二章 有名管道有名管道u打开和关闭FIFO。uint open(const char *pathname, int flags);uint close(int fd);uLinux的一切都是文件这一抽象概念的优势,打开和关闭FIFO和打开关闭一个普通文件操作是一样的。uFIFO的两端使用前都必须要打开。uopen中如果参数flags为O_RDONLY将阻塞o

7、pen调用,一直到另一个进程为写入数据打开FIFO为止。相同的,O_WRONLY也导致阻塞一直到为读出数据打开FIFO为止。第二章第二章 有名管道有名管道u读FIFO例子u写FIFO例子int main(int arg, char * args)int len = 0;char buf100;memset(buf, 0, sizeof(buf);int fd = open(fifo1, O_RDONLY);while (len = read(fd, buf, sizeof(buf) 0)printf(%sn, buf);close(fd);return 0;int main(int arg,

8、char * args)int len = 0;char buf100;memset(buf, 0, sizeof(buf);int fd = open(fifo1, O_WRONLY);while(1)scanf(%s, buf);if (buf0 = 0)break;write(fd, buf, sizeof(buf);close(fd);return 0;ContentsContents无名管道无名管道 有名管道有名管道共享内存共享内存 123共享库共享库so 第三章第三章 共享内存共享内存u共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段)。u如果段的权限设置恰当,

9、每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中。u如果一个进程更新了段中的数据,其他进程也立即会看到更新。u由一个进程创建的段,也可以由另一个进程读写。u每个进程都把它自己对共享内存的映像放入自己的地址空间。第三章第三章 共享内存共享内存u创建共享内存区。u#include u#include uint shmget(key_t key, size_t size, int shm-flg);u参数key既可以是IPC_PRIVATE,也可是是ftok函数返回的一个关键字。u参数size指定段的大小。u参数flagsu八进制数,0 xxx。转化为二进制后分别代表rw-rw-rw-u

10、shmget成功返回段标示符,失败返回-1。第三章第三章 共享内存共享内存u创建共享内存区。uint main(int arg, char * args)uuint shmid = shmget(IPC_PRIVATE, 1024, 0666);uif (shmid 1)shmid = atoi(args1);shmbuf = shmat(shmid, 0, 0);sleep(60);shmdt(shmbuf);return 0;第三章第三章 共享内存共享内存u共享内存读写例子。int main(int arg, char * args)char *shmbuf;int shmid = 0;i

11、f (arg 2)shmid = atoi(args1);shmbuf = shmat(shmid, 0, 0);if (atoi(args2) = 1) /write shared memscanf(%sn, shmbuf);if (atoi(args2) = 2) /read shared memprintf(%sn, shmbuf);shmdt(shmbuf);return 0;ContentsContents无名管道无名管道 有名管道有名管道共享内存共享内存 123共享库共享库so 第四章第四章 共享库共享库sosouso文件在linux中为共享库,与windows下的dll类似。us

12、o文件中的函数可供多个进程调用,最大可能的提供二进制代码的复用。u共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性的时候,用户只需要获得升级后的so并安装他就可以。u注:即使不同的进程调用同一个so文件,通过共享库并不能实现不同进程间的通讯,因为同一个so被不同进程加载加载到不同的内存空间。第四章第四章 共享库共享库sosouso文件编译方法uso文件的源文件中不需要有main函数,即使有也不会被执行。u编译的时候gcc需要加-fPIC选项,这可以使gcc产生与位置无关的代码。u连接的时候gcc使用-shared选项,指示生成一个共享库文件。u共享库文件名要以lib开头,扩

13、展名为.so。第四章第四章 共享库共享库sosou编写so的例子。utest.c源文件int max(int a, int b)if (a b)return a;elsereturn b;int add(int a, int b)return a + b;第四章第四章 共享库共享库sosou 编写so的例子。u test.h头文件#ifndef TEST_H_#define TEST_H_int max(int a, int b);int add(int a, int b);#endif /* TEST_H_ */第四章第四章 共享库共享库sosou编写so的例子。umakefile.SUFF

14、IXES:.c .oCC=gccSRCS=test.cEXEC=libtest.soOBJS=$(SRCS:.c=.o)start:$(OBJS)$(CC) -shared -o $(EXEC) $(OBJS) .c.o:$(CC) -g -fPIC -o $ -c $clean:rm -f $(OBJS)第四章第四章 共享库共享库sosouso文件使用方法u为了让linux能找到so文件的位置,需要在.bash_profile中添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.u或者将so文件放入linux的系统目录/usr/lib/u在c文件中使用so文

15、件,首先需要 #inluce相关h文件。ugcc连接时添加 L参数指明so文件存放路径,-l参数指明so文件名u以libtest.so文件在当前路径下举例ugcc -L. -ltest -o a a.ou其中-L.意思为在当前路径下寻找so文件u-ltest意思为要链接libtest.so这个库文件u-o a 意思为编译后的可执行文件名为第四章第四章 共享库共享库sosou调用so的例子。ua.c#include test.h#include int main() printf(%dn, max(4, 5); printf(%dn, add(4, 5); return 0;第四章第四章 共享库

16、共享库sosou调用so的例子。umakefile.SUFFIXES:.c .oCC=gccSRCS=a.cEXEC=aOBJS=$(SRCS:.c=.o)start:$(OBJS) $(CC) -L. -ltest -o $(EXEC) $(OBJS) .c.o: $(CC) -o $ -c $clean: rm -f $(OBJS)第四章第四章 共享库共享库sosou当我们在cpp文件中包含test.h文件,用g+链接libtest.so这个库时会报错:u(.text+0 x19): undefined reference to max(int, int)u(.text+0 x3d): u

17、ndefined reference to add(int, int)u为了使我们编写的so文件同时可以被C或者C+调用,我们需要修改一下h文件中的函数申明部分。u增加带有_cplusplus的预编译指令。u_cplusplus是c+编译器预定义的一个宏,比如用g+的时候这个宏就被提前定义了第四章第四章 共享库共享库sosou 编写so的例子。u test.h头文件u 如果是c+编译器会默认定义_cplusplus这个宏。u 当使用gcc编译的时候产生如下结果:u int max(int a, int b);u int add(int a, int b);u 当使用g+编译的时候,产生如下结果:u extern Cu int m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论