1. 看了进程之间通信,想消息队列与共享内存区别在哪里?因解决什么问题而共同需要他们,而不能合并为一,因之前缺少这方面的经验,问的问题可能比较简单?但不妨碍对于问题入口的思考。他们都可以用于进程之间通信,但是我要区别我读到了主要表现在这几个方面:a. 效率,共享内存读写效率要高于消息队列,共享内存主要是节省来内存的数据交换,减少通过内核传递数据的次数。b. 同步,消息队列具有固有的同步开销,共享内存无同步保障,多线程访问可能发生冲突,共享内存需要人为保证线程安全,而且在默认的情况下,子进程并不与父进程共享内存区。
2. 有pipe了,为啥还要popen?pipe太简单了,只是用来创建一个管道,剩下来的事情交给程序去做。popen做了很多事,包括创建管道,fork,调用sh执行command,完成来由一个进程,创建一个管道到另一个进程。popen返回FILE指针,用于关联子进程的输入与输出。下图引用被人的例子:
Result of fp = popen(cmdstring, "r")
Result of fp = popen(cmdstring, "w")
3. pipe创建的是无名管道,局限处是只允许亲缘进程之间通信,当非亲缘之间可以用mkfifo,创建有名管道。
prw-r--r-- 1 gz gz 0 2013-06-14 20:41 fifo.1
prw-r--r-- 1 gz gz 0 2013-06-14 20:41 fifo.2
任何想使用管道的进程只要成功open即可。
4. 一段书中代码注释:
#include "unpipc.h"int
main(int argc, char **argv)
{
int fd, i;
char *ptr;
size_t filesize, mmapsize, pagesize;
/*
pathname:创建并映射到内存文件的路径名字
filesize: 文件设置成的大小
mmapsize: 内存映射区的大小
*/
if (argc != 4)err_quit("usage: test1 <pathname> <filesize> <mmapsize>");
filesize = atoi(argv[2]);
mmapsize = atoi(argv[3]);
/*
打开文件,若不存在创建,存在,将其长度截为0。通过Lseek将文件大小设置成指定文件长度的大小,办法是将文件读写指针移动到大小减1的字节位置,然后写1个字节
*/
fd = Open(argv[1], O_RDWR | O_CREAT | O_TRUNC, FILE_MODE);Lseek(fd, filesize-1, SEEK_SET);
Write(fd, "", 1);
/*设定内存映射区的大小mmapsize,与文件描述符进行映射*/
ptr = Mmap(NULL, mmapsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);Close(fd);
/*sysconf取得页面大小*/
printf("PAGESIZE = %ld\n", (long) pagesize);
for (i = 0; i < max(filesize, mmapsize); i += pagesize) {
printf("ptr[%d] = %d\n", i, ptr[i]); /*输出每个页面的首字节*/
ptr[i] = 1; /*将首字节设置为1*/
printf("ptr[%d] = %d\n", i + pagesize - 1, ptr[i + pagesize - 1]); /*输出尾字节*/
ptr[i + pagesize - 1] = 1; /*将尾字节设置为1*/
}
printf("ptr[%d] = %d\n", i, ptr[i]);
exit(0);
}