一些读书随笔(1)


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取得页面大小*/

    pagesize = Sysconf(_SC_PAGESIZE);
    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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值