- 博客(62)
- 收藏
- 关注
转载 pthread_cond_wait前面使用while()问题
概念: 假设实现一个生产者消费者模型,仓库只能装100万件item,生产者每次生产1件,消费者每次消费1件,为了保持数据的同步,那么生产者每次都需要检查仓库是否满了,消费者每次都需要检查仓库是否空了,在加上互斥锁前提下,数据是能得同步保证的。循环的访问且每次都给互斥锁加锁解锁,又称为轮询,如果经常做无用功则线程一直在空转,十分浪费CPU。如果在仓库满了,我们希望生产者停下来等待,同理如果仓库空了
2017-01-16 11:21:04
1664
转载 生产者,消费者问题
互斥锁实现:“生产者/消费者”问题描述:有一个有限缓冲区和两个线程:生产者和消费者。他们分别把产品放入缓冲区和从缓冲区中拿走产品。当一个生产者在缓冲区满时必须等待,当一个消费者在缓冲区空时也必须等待。1. 单锁模型[cpp] view plain copy print?#include”stdio.h” #include”pthread.h” int buffer[10];
2017-01-16 11:00:44
902
转载 信号量,互斥锁,条件变量
互斥锁[plain] view plain copy print?pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 或 pthread_mutex_t mutex; int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) int
2017-01-16 10:43:45
480
转载 mongoose源码分析(二)(转)
目录(?)[-]引言线程模型从程序入口着手Mongoose的生命旅程总结 引言我看一个项目的时候,比较喜欢首先看它的架构和设计。因为这样在研读源码的时候,有一个指导作用,不会迷失于具体细节,并能够引导我如何去将点串成线,将线串成面。而且一个软件怎么样,很大程度上取决于它采用的架构。本文主要介绍Mongoose的工作模型,及根据这个模型将代码大致串起来,找出主线。内容框架如下:1、线程模型2、从程
2017-01-12 16:01:17
494
转载 read()返回值问题
作者:gfree.wind@gmail.com博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net 本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。=================================
2017-01-04 15:41:46
1055
转载 linux中线程使用的错误
接触了Linux系统编程中的线程编程模块,可gcc sample.c(习惯把书上的sample代码写进sample.c文件中)出现“undefined reference to ‘pthread_create’”,所有关于线程的函数都会有此错误,导致无法编译通过。问题的原因:pthread不是Linux下的默认的库,也就是在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。
2016-12-23 16:55:31
399
转载 fork exec对子进程继承父进程信号处理机制的影响--APUE
当一个进程调用fork时,因为子进程在开始时复制父进程的存储映像,信号捕捉函数的地址在子进程中是有意义的,所以子进程继承父进程的信号处理方式。特殊的是exec,因为exec运行新的程序后会覆盖从父进程继承来的存储映像,那么信号捕捉函数在新程序中已无意义,所以exec会将原先设置为要捕捉的信号都更改为默认动作。1,fork后子进程会继承父进程的信号屏蔽字,再继续exec后仍会继承这个
2016-12-23 11:32:43
3727
1
转载 linux的历史的使用
1、!的使用⑴!!重复前一个命令⑵!字符 重复前一个以“字符”开头的命令⑶!num 按照history命令输出中的序号来重复对应命令⑷!?abc 重复前一个包含abc的命令⑸!-n 重复n个命令之前的那个命令2、按键组合⑴使用up和down键来上下浏览之前执行的命令⑵键入ctr+r来在命令历史中搜索命令
2016-12-20 22:15:34
228
转载 CS231n课程笔记翻译
贺完结!CS231n官方笔记授权翻译总集篇发布 - 智能单元 - 知乎专栏 https://zhuanlan.zhihu.com/p/21930884CS231n课程笔记翻译:图像分类笔记(上) - 智能单元 - 知乎专栏https://zhuanlan.zhihu.com/p/20894041 CS231n课程笔记翻译:图像分类笔记(下) - 智能单元 - 知乎专栏https://zh
2016-12-13 21:49:57
436
转载 带缓存IO和不带缓存IO
首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(Application P
2016-12-08 17:28:56
425
转载 fread和read
fread与read的区别---open和fopen的区别--fread函数和fwrite函数fread与read的区别f是ANSI的C标准库。而后者的是UNIX下的系统调用。fread带有缓冲,是read的衍生,或者说fread是通过read实现的要想直接和硬件打交道,必须用readfopen/fread是C标准的库函数,操作的对象是: file st
2016-12-05 17:11:54
677
转载 对EOF的理解(整理)
EOF就是文件尾的意思,一般被编译器定义为-1 倒不是说文件自己会自动生成一个EOF标志,而是你在用函数读入文件数据的时候,函数总会返回一个状态,是读取成功还是失败,那么这个状态怎么表示呢,所以就约定俗成定义一个标识符表示这个状态,就有了EOF,BOF等等EOF不是文件中有的。只不过是一个文件操作函数,在文件结尾操作时候返回的错误码。不要认为文件中含有EOF。 换行和回车是
2016-12-05 16:34:40
3027
转载 SIGPIPE
当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试. 但是服务器总是莫名退出,没有core文件.最后问题确
2016-12-02 10:54:34
1722
原创 tcpdump
抓取本地lookback的包,tcp -i lotcp抓到的包的解析用tcpdump捕获的TCP包的一般输出信息是:src > dst: flags data-seqno ack window urgent optionssrc > dst:表明从源地址到目的地址, flags是TCP报文中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R
2016-12-01 20:10:22
287
原创 netstat中Recv-Q不为0的问题
ecv-Q Send-Q分别表示网络接收队列,发送队列。Q是Queue的缩写。这两个值通常应该为0,如果不为0可能是有问题的。Recv-Q不为0通常是指接收端接收的数据在内核中即recv-q不为零,通常是socket中有数据,但是应用程序没有读。检查程序中读取数据的函数。可能出现错误。
2016-11-30 20:52:00
12095
1
转载 writen()和readn()函数
写函数write #include <unistd.h>ssize_t write(int fildes,const void *buf,size_t nbyte) write函数将buf中的nbyte字节内容写入文件描述符fd引用的打开文件中,成功时返回写的字节数,失败时返回-1。 并设置errno变量. 在网络程序中,当我们向套接字文件描述符写时有两种可能. 1)write的返回值大于0,
2016-11-30 09:38:22
2956
转载 unable to locate package
apt-get更新软件包时常出现错误提示Unable to locate package update解决方法是: 先更新apt-get #sudo apt-get update 执行完后,问题就解决了。继续更新: #sudo apt-get upgrade
2016-11-29 15:36:38
327
转载 UNP环境
下面开始用简单但典型的客户端和服务器端程序说明如何进行网络编程。这一小节讲的是客户端,一个用来连接并读取服务器发送来的时间的客户端。这里涉及到了编写代码,因此要搭建unix网络编程环境unix系统我没安装,系统不易获得而且也没必要安装unix。用Linux是最佳选择。再者我本来就是ubuntu系统,所以就在ubuntu下搭建环境了。1,安装编译器,为了齐全还是安装一下build-essent
2016-11-25 17:19:26
561
转载 线程池实例
实例一#include #include #include #include #include #include typedef struct worker //运行和等待的任务链表结构{ void *(*process) (void *arg); //任务运行时会调用该函数 void *arg; struct worker *next;} CThread
2016-11-16 17:30:19
263
转载 线程的分离状态
线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性,一般是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。 关于分离线程的一种用法(转) 讲到分
2016-11-16 10:39:29
432
转载 pthread_cleanup_push()/pthread_cleanup_pop()
一、为什么会有pthread_cleanup_push与pthread_cleanup_pop:一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。不论是可预见的线程
2016-11-16 09:37:35
359
转载 僵死进程
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵死进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵死进程。补救办法是杀死僵尸进程的父进程(僵死进程的父进程必然存在),僵死进程成为"孤儿进程",过继给1号进程init,ini
2016-11-15 17:15:14
242
转载 pthread_cond_wait()函数实际的执行过程
/************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock); /*lock*/pthread_cond_wait(&qready, &qlock); /*block-->unlock-->wait() return-->lock*/pthread_mutex_unlock(&qlock);
2016-11-15 16:27:00
1144
转载 http请求头If-Modified-Since & If-None-Match
If-Modified-Since & If-None-MatchIf-Modified-Since,和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,可 以看到,再次请求本地存在的 cache 页面时,客户端会
2016-11-10 11:11:02
1798
转载 http中的expect
1、http 100-continue用于客户端在发送POST数据给服务器前,征询服务器情况,看服务器是否处理POST的数据,如果不处理,客户端则不上传POST数据,如果处理,则POST上传数据。在现实应用中,通过在POST大数据时,才会使用100-continue协议。 2、客户端策略。 1)如果客户端有POST数据要上传,可以考虑使用100-continue协议。加入头{"Ex
2016-11-09 15:05:58
1495
转载 __attribute__((format(printf,x,y)))
From http://hi.baidu.com/cygnusnow/blog/item/8b82000f871fcf2f6159f3de.htmlGNUC的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Att
2016-11-08 09:41:42
1377
转载 c语言中的目录操作
头文件:#include#includeopendir():函数原型:DIR * opendir(const char* path);打开一个目录,在失败的时候返回NULL(如果path对应的是文件,则返回NULL)DIR 结构体的原型为:struct_dirstream 在linux系统中: typedef struct __di
2016-11-07 17:24:06
797
原创 一些小知识点2
1.stat函数讲解表头文件: #include #include 定义函数: int stat(const char *file_name, struct stat *buf);函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值: 执行成功则返回0,失败返回-1,错误代码存于
2016-11-04 09:36:04
357
转载 websocket协议解析
转自www.cnblogs.com/zhouto/p/4170651.htmlWebSocket protocol 是HTML5一种新的协议。它是实现了浏览器与服务器全双工通信(full-duplex)。 现 很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器
2016-11-03 16:10:24
314
转载 md5,sha1
md5、sha1都是一种hash算法,对于任意长度的数据,经过运算之后得到结果长度都是固定的,并且是不可逆的,也就是说在不知道原始数据的情况下破解是非常困难的,通常用于密码的加密存储、数字签名、文件完整性校验等等,代码如下:[cpp] view plain copy #include #include #include void bufdump(ch
2016-11-03 15:18:06
294
转载 Websocket原理
一、websocket与httpWebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个HTTP请求合并为一个,但是Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规
2016-11-03 14:49:59
292
转载 digest认证
参考网址:http://www.faqs.org/rfcs/rfc2617.htmlhttp://www.faqs.org/rfcs/rfc1321.htmlhttp://www.cnblogs.com/my_life/articles/2285649.htmlhttp://blog.sina.com.cn/s/blog_53b15ed5010006t9.htmlhttp://blog.chinau
2016-11-03 10:49:46
928
原创 当读入一个数字,scanf()函数的写法
主函数是int main(){ int value=0; value=read(); printf("数字是%d\n",value); return 0;}一些测试用力1).15sdd\n2).16 1456\n3).aa 7\n4)a\nread()函数的写法一:int read(){ int
2016-11-02 11:27:05
3154
转载 fflush(stdin)使用误区
1. 为什么 fflush(stdin) 是错的?首先请看以下程序:include <stdio.h>int main( void ){int i;for (;;) { fputs(“Please input an integer: “, stdout); scanf(“%d”, &i); printf(“%d\n”, i);} return 0
2016-11-02 11:08:09
721
转载 由scanf说起之1:scanf函数和回车、空格 及其返回值
scanf和回车的关系: 先看一个我们经常使用的代码: char c; scanf("%c", &c); scanf 的各种格式中,%d、%c、%s三种最常用,通常都是以回车作为一次输入的结束。由于对字符解析方式及字符特点不同(如数字中一般不会出现空格回车等特殊字符)不同,%d格式一般不会在连续输入时,遇到问题。而%s和%c却会出现各种各样的问题,比如回车问题,空格问
2016-11-02 10:48:44
1330
原创 换行符是\n,\r\n???
说法一:换行符是\r\n 写程序时用\n说法二:windows下换行符是\r\n,UNIX下是\n说法三:用二进制方式时是\r\n,用文本方式时是\n说法四:是\r\n跟操作系统没关系,跟编辑软件有关系。当你在记事本或word编辑时,按下enter,该软件默认的方式是插入回车\r,再插入换行\n。当然如果在word下,按shift+enter,word这
2016-11-02 10:11:51
7626
转载 menmove()用法
头文件:#include memmove() 用来复制内存内容,其原型为: void * memmove(void *dest, const void *src, size_t num);memmove() 与 memcpy() 类似都是用来复制 src 所指的内存内容前 num 个字节到 dest 所指的地址上。不同的是,memmove() 更为灵活,当src 和
2016-10-27 15:09:43
760
原创 memchr与strchr的区别
NAME memchr, memrchr - scan memory for a characterSYNOPSIS #include void *memchr(const void *s, int c, size_t n); void *memrchr(const void *s, int c, size_t n)
2016-10-27 10:57:31
1436
转载 printf()输出格式
ref : http://www.cnblogs.com/yuaqua/archive/2011/10/21/2219856.html 小数点.后“*”表示输出位数,具体的数据来自参数表printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”。同样,小数点.前也可以添加*,也要用户输入一个位宽值来代替
2016-10-27 09:42:02
551
原创 strlen()和sizeof()总结
1.strlen()为一个函数,用来计算字符串的长度,其原型为:unsigned int strlen (char *s);在计算时,从字符串的首地址开始搜索字符串结束符‘\0’,返回的值不包括结束的字符‘\0’。其中当s为字符数组时,也是搜索字符串结束符,所以一些情况要手工添加‘\0’例如:char b[] = "abcde";char aa[6];memcpy(aa,b
2016-10-26 10:55:37
646
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人