2016-03-31总结

效率不太高啊,记录一下下面这两个比较坑的地方:

1. 管道实际存储在内存中,不管是有名管道还是无名管道,都放在内核的缓冲区中。

管道有下面两个限制:

1)管道容量有限制,并且不能更改,所以需要大规模数据通信是不适合使用管道的,在linux下这个限制为64K,65535个字节。

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<signal.h>

int main(int argc, char *argv[])
{
    int pipefd[2];
	char buf[100000] = {0};
    if (pipe(pipefd) == -1) {
		fprintf(stderr, "pipe error");
		return 1;
	}

    int ret;
    int count = 0;
    int flags = fcntl(pipefd[0], F_GETFL);
    fcntl(pipefd[1], F_SETFL, flags | O_NONBLOCK); // 设置为非阻塞
    while (1)
    {
        ret = write(pipefd[1], buf, sizeof(buf));
        if (ret == -1)
        {
            printf("write error: %s\n", strerror(errno));
            break;
        }

        count++;
    }
    printf("count = %d\n", count); //管道容量

    return 0;

}

2) 管道有一个缓冲区的限制。即PIPE_BUF,这是write原子性写入的最大长度,具体如下:

write的fd是阻塞模式的:

写入的字符n <=  PIPE_BUF, 如果PIPE还有足够的空间,原子性写入。如果剩余空间不足,阻塞一直到能全部写入。

写入的字符n > PIPE_BUF, 写入不是原子性的,可能和其他进程交叉,一直阻塞到全部n个字符写入成功。

write的fd是非阻塞的:

写入的字符n <= PIPE_BUF, 如果没有足够的空间,会返回失败,错误码EAGIN

写入的字符n > PIPE_BUF, 如果没有足够的空间,可能写入1-n中任何一个值的字符,需要将返回值收回来自行判断。

2. 今天将标准输入和标准输出重定向到了文件中,然后想用epoll去等待这个文件的读写事件,但是在epoll_ctl的时候发现失败了:epoll_ctl:Operation not permitted. 查找了一下才发现:regular file(也就是普通文件)是不支持epoll/select操作的,这是因为他们处于随时可读/写的状态。

时间: 2024-11-05 07:55:58

2016-03-31总结的相关文章

&ldquo;耐撕&rdquo;团队 2016.03.31 站立会议

1. 时间: 19:30--19:50  共计20分钟. 2. 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:http://www.cnblogs.com/charliePU/), Q 齐嘉亮(博客:http://www.cnblogs.com/dendroaspis-polylepis/), L  刘伟硕(博客:http://www.cnblogs.com/WeSure6/) 注:Z因个人原因,未能参加本次会

“耐撕”团队 2016.3.31 站立会议

”耐撕“团队 2016.3.31站立会议 1. 时间:20:15--21:55 2. 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:http://www.cnblogs.com/charliePU/), Q 齐嘉亮(博客:http://www.cnblogs.com/dendroaspis-polylepis/), L  刘伟硕(博客:http://www.cnblogs.com/WeSure6/), 3.会议

2016年31期老男孩运维班学员决心书

2016年31期老男孩运维班学员决心书 张孟鑫 一.我为什么来这学习 在这个经济.政治.科技发展迅速的当代社会,掌握一门甚至多门技术已成为生活.工作必不可少的一部分,而在今天我听了老男孩教育创始人的讲课以及学长们的学习经验.体会,我感觉我好想找到我想要的那种感觉(可以让我奋斗让我拼搏),所以我决定了一定要将老男孩的部分东西变成我的,不然我愧对父母以及浪费的时间,所以我来到了这里,来奋斗. 二.我的学习方法.安排 我要用我可以利用的时间去学习,课前预习,上课跟随老师的步骤,课后总结.复习.实践.

分布式技术一周技术动态 2016.03.20

分布式系统实践 1. 基于Mesos和Docker的分布式计算平台 https://mp.weixin.qq.com/s?__biz=MzAxMDgzOTA2Mw==&mid=402769128&idx=1&sn=cea3ad1357bd9312acf1768c0a493bfd&scene=1&srcid=0318BTuxT0fsFYwPjpeyuDOa&key=710a5d99946419d90fbc1e7600cce055b6e997d6afafc74c

Murano Weekly Meeting 2016.05.31

Meeting time: 2016.May.31 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1.Action Item Review update the wiki to mention new CPLs. kzaitsev_mb ping stable reviewers to review the backports. 2.Murano packages move into murano-a

FFmpeg static build - MinGW32-GCC-5.3.0_x86-x64_D_Drive_for_FFmpeg_static_2016.03.31

算是最终版本,暂不更新 下载地址 MinGW32-GCC-5.3.0_x86-x64_D_Drive_for_FFmpeg_static_2016.03.31.7z 下载地址 ffmpeg-20160331-snapshot-bin.7z autoopts.pc AutoOpts 33.2.8 caca++.pc caca++ 0.99.beta18 caca.pc caca 0.99.beta18 celt.pc celt 0.11.3 dcadec.pc dcadec 0.2.0 fdk-a

2016/3/31 拾遗 php字符串中 转义字符 “ ’‘ ” ’ “” ‘ &quot; \’ &#39; &#39; \‘ &quot; &quot; \&quot; &#39;&#39; \ &quot; &quot; 使用

1 <?php 2 3 4 5 6 echo $str_string1='甲问:"你在哪里学的PHP?"'; 7 echo "<br />"; 8 echo $str_string2="乙毫不犹豫地回答:'慕课网'"; 9 echo "<br />"; 10 echo $str_string3='甲问:\'能告诉我网址吗?\''; 11 echo "<br />";

Cheatsheet: 2016 03.01 ~ 03.31

JAVA Quick Java 8 or Java 7 Dev Environments With Docker Printing arrays by hacking the JVM Mobile How to Create a News Reader With React Native: Web Page Component Managing Mobile Performance Optimization Android From Scratch: Building Your First An

switch结构2016/03/08

Switch  03/08 一.结构 switch(){  case *: ;break;……default: ;brek;} 练习:输入一个日期,判断这一年第几天? Console.Write("请输入月份"); int m = int.Parse(Console.ReadLine()); Console.Write("请输入几号"); int d = int.Parse(Console.ReadLine()); int m1 = 31, m2 = 28, m3

uboot.2016.03 在mini2440上norfalsh启动

本人有点懒惰,直接在smdk2410的基础上进行修改 (note :红色字体表示修改内容,蓝色字体表示增加内容) 1. 顶层的makefile 在247行 添加如下两条语句 :   ARCH :=arm     CROSS_COMPILE :=arm-linux- 2 修改始终频率 打开 u-boot-2016.03/arch/arm/cpu/arm920t/start.S 第77行 #if defined(CONFIG_S3C2410) #if defined(CONFIG_S3C2440)