Linux
文章平均质量分 69
iamlate
这个作者很懒,什么都没留下…
展开
-
WinSock I/O系列1:多路复用I/O支持多Client的实现及效率讨论
1. 引言多路复用I/O模型(select)是UNIX/LINUX用得的最多的一种I/O模型,在Windows下也可做为一种同步I/O使用。本文给出该I/O模型处理多Client的简单(在主线程中)实现。2. 关于selectselect I/O模型是一种异步I/O模型,在单线程中Linux/WinNT默认支持64个客户端套接字。这种转载 2011-10-19 01:18:24 · 957 阅读 · 0 评论 -
Linux文件rwx属性的含义
Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示 一般文件名外,连隐藏文件也会显示出来。 ls -l(这个参数是字母L的小写,不是数字1) 这个命令可以使用长格式显示文件内容,如果需要察看更详细的文件资料,就要用到ls -l这个指令。例如我在某个目录下键入ls -l可能会显示如下信息(一共7个栏位): 文件属性 文件数 拥有者转载 2011-10-27 14:14:06 · 1381 阅读 · 0 评论 -
父子进程之间的参数传递和数据返回 pthread_create & pthread_join
自己睡不着敲着玩的,第一个程序是主线程传递一个结构体地址给子线程,第二个传递字符串,第三个是子线程通过pthread_exit()传递数据,然后pthread_join阻塞那里捕获。 int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr,原创 2011-10-27 02:43:18 · 2801 阅读 · 0 评论 -
信号量和进程共享内存的小例子
semm.h#include #include #include #include #include #include typedef int sem_t;union semun{ int val; struct semid_ds *buf; unsigned short *array;} arg;sem_t CreateSem(key_t key, int转载 2011-10-26 15:18:42 · 852 阅读 · 0 评论 -
Linux进程间通信(一)——管道、信号量
一、Linux进程间通信方式 :有六种方式在两个程序间传递信息 1、信号( Singal ) 2、管道 ( Pipe ) 及有名管道 3、信号量 ( Semaphore ) 4、共享内存 ( SharedMessage) 5、消息队列 ( MessageQueue )转载 2011-10-25 00:42:07 · 810 阅读 · 1 评论 -
linux系统调用之ftok()
ftok原型如下: key_t ftok( char * fname, int id ) fname就时你指定的文件(存在,可以访问的)名,id是子序号。先来简单的叙述一下,如果不太清楚的话,再接着向下看: ftok函数是根据pathname和id来创建一个关键转载 2011-10-25 18:06:42 · 725 阅读 · 0 评论 -
Linux进程间通信(二)——共享内存、消息队列
一、共享内存 最高效的进程间通信机制。多个进程共享一段内存。需要依靠某种同步机制,如互斥锁或信号量。 通常步骤为:创建 -> 映射 -> 使用 -> 撤销映射 ->删除 相关函数可以参考:Linux 共享内存#include #includ转载 2011-10-25 00:45:41 · 719 阅读 · 0 评论 -
进程返回值
#include #include #include int main(){pid_t pid;int status;if((pid = fork()) printf("fork error");else if(pid == 0)exit(7);if(wait(&status) != pid)printf("wait error");转载 2011-10-24 16:27:04 · 525 阅读 · 0 评论 -
Linux select() 详解
select系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的转载 2011-10-19 01:06:27 · 1307 阅读 · 0 评论 -
关于“双工”什么的
全双工是通讯传输的一个术语 单工就是在同一时间只允许甲方向乙方传送信息,而乙方不能向甲方传送 。(比喻汽车的单行道) 全双工(Full Duplex)是 在微处理器与外围设备之间采用发送线和接受线各自独立的方法,可以使数据在两个方向上同时进行传送操作。指在发送转载 2011-10-18 18:13:56 · 721 阅读 · 0 评论 -
一个简单的互斥锁的例子
/*thread_example.c : c multiple thread programming in linux */#include#include#include#include#define MAX1 10#define MAX2 30pthread_t thread[2];pthread_mutex_t mut;int number=0,转载 2011-10-25 01:42:45 · 1387 阅读 · 0 评论 -
read/write的包裹函数
《Unix环境高级编程》ssize_t writen (int fd, const void *buf, size_t num) { ssize_t res; size_t n; const char *ptr; n = num; ptr = buf; while (n > 0) { /* 开始写*/ if ((res = write转载 2011-10-28 23:43:34 · 668 阅读 · 0 评论 -
关于IO阻塞和非阻塞的零碎知识
1, 关于阻塞的概念阻塞(Block)这个概念。当进程调用一个阻塞的系统函数时,该进程被置于睡眠(Sleep)状态,这时内核调度其它进程运行,直到该进程等待的事件发生了(比如网络上接收到数据包,或者调用sleep指定的睡眠时间到了)它才有可能继续运行。与睡眠状态相对的是运行(Running)状态,在Linux内核中,处于运行状态的进程分为两种情况:正在被调度执行。CPU处于转载 2011-10-29 00:03:25 · 899 阅读 · 0 评论 -
带有xml转发的select非阻塞,修正了一个错误
修改部分在transfer.c第288行,修改如下ptr = conns[m].totalBuffer;conns[m].edSize = 0;//-----------------------同一文件,这样修改貌似可以减少提示出现的不是utf-8字符串的问题。79 content[target->XmlLength+1] = '/0';//about utf-8p原创 2011-11-09 00:34:00 · 1108 阅读 · 0 评论 -
%m和其他参数
GNU glibc provides an extension to printf, %m, which outputs strerror(errno).This specifications fields only available on glibc, not portableto other compiler, like VC 6.0.e.g.#include #转载 2011-11-08 17:59:47 · 1395 阅读 · 0 评论 -
两个应该注意的小问题
1,套接口程序中使用的int,short,long等数字数据需要网络字节序的转化。2,原创 2011-11-08 15:31:31 · 523 阅读 · 0 评论 -
反思:关于select的一些经历
今天交了,该了几改的程序。是一个服务器转发聊天程序,第一次是在别人例子的基础上直接做得。后来,发现我用得时阻塞,当时考虑的问题太多。包括一个包分了好几次才收到,或者一次收到了,相互独立且完整的几个包。最重要的一个问题是,在使用费阻塞的io以后,因为对select的FD_ISSET理解错误(我认为是不是变化,但事实上是不是在集合内),我对select返回可读套接字后能不能一定读到数据产生了疑问。原创 2011-11-08 12:33:38 · 776 阅读 · 0 评论 -
文件描述符与Linux文件IO
Linux系统可以看成是一个由文件组成的系统,在linux系统中,基本上所有的设备,硬件,资源都被看成一个文件,比如,在/dev下面我们可以看到我们的硬盘sda1(我的机器是安装的SCIS硬盘的虚拟机),终端设备ttyn,在/proc目录下面我们可以看到当前的内存信息,cat /proc/meminfo,可以查看CPU的信息: cat /proc/cpuinfo , 这些文件都是被linux系统抽转载 2011-11-08 16:20:58 · 1211 阅读 · 1 评论 -
使用select+非阻塞socket写的网络数据转发程序
在与远程服务器connect的时候,程序要等待连接完全建立完毕才返回,这里会让程序产生延迟。而在非阻塞中不会等待,直接去处理其它连接。“程序有问题,暂时未仔细看”#include #include #include #include #include #include #include #define closesocket cl转载 2011-10-29 01:49:54 · 1880 阅读 · 1 评论 -
关于errno与perror,strerror函数
errno是一个由POSIX和ISO C标准定义的符号,看(用)起来就好像是一个整形变量。当系统调用或库函数发生错误的时候,比如以只读方式打开一个不存在的文件时,它的值将会被改变,根据errno值的不同,我们就可以知道自己的程序发生了什么错误,然后进行相应的处理。有人说,函数不是可以返回值吗,根据返回值照样可以判断程序在哪里出错了,为什么还需要errno?如果你有这样的疑问,推荐你看下这篇文章。转载 2011-10-28 18:01:06 · 922 阅读 · 0 评论 -
linux非阻塞的socket EGGAIN的错误处理
在Linux中使用非阻塞的socket的情形下。(一)发送时 当客户通过Socket提供的send函数发送大的数据包时,就可能返回一个EGGAIN的错误。该错误产生的原因是由于send 函数中的size变量大小超过了tcp_sendspace的值。tcp_sendspace定义了应用在调用send之前能够在kernel中缓存的数据量。当应用程序在socket中设置了O_NDELA转载 2011-10-29 00:55:00 · 1467 阅读 · 1 评论 -
linux下非阻塞的tcp研究
这是根据自己的笔记整理的,如有错误,欢迎指出来. tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下,send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时转载 2011-10-29 00:46:49 · 825 阅读 · 0 评论 -
linux socket的select函数例子
使用select函数可以以非阻塞的方式和多个socket通信。程序只是演示select函数的使用,功能非常简单,即使某个连接关闭以后也不会修改当前连接数,连接数达到最大值后会终止程序。1. 程序使用了一个数组fd_A,通信开始后把需要通信的多个socket描述符都放入此数转载 2011-10-19 01:32:52 · 5224 阅读 · 2 评论 -
Linux网络编程. 服务器模型(软件工程节选)
学习过《软件工程》吧.软件工程可是每一个程序员"必修"的课程啊.如果你没有学习过, 建议你去看一看. 在这一章里面,我们一起来从软件工程的角度学习网络编程的思想.在我们写程序之前, 我们都应该从软件工程的角度规划好我们的软件,这样我们开发软件的效率才会高. 在网络程序里面,一般的转载 2011-10-19 01:11:11 · 672 阅读 · 0 评论 -
大小端对齐
不同的 CPU 有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1 . Little endian :将低序字节存储在起始地址2 . Big endian : 将高序字节存储在起始地址 基本知识,回顾一下转载 2011-10-04 23:10:05 · 8282 阅读 · 1 评论 -
二进制文件读写
我一直觉得二进制文件读写是个很容易的事,所以一直没在意,最近在写一个http客户端,实现文件下载的时候,发现总有问题,后来才发现是忘记写文件用二进制方式,惭愧的很啊。然后,就在网上搜索了一下,发现通过C语言实现二进制文件读写的资料居然出奇的少,这让我很愤怒,因为虽然这东西很简转载 2011-09-29 10:01:37 · 449 阅读 · 0 评论 -
Linux获取本机IP
#include #include #include #include #include #include #include #define ERRORIP "cannot find host ip"char *ip_search(void){转载 2011-09-29 15:24:39 · 1770 阅读 · 0 评论 -
fopen /open,read/write和fread/fwrite区别
fopen /open区别UNIX环境下的C对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别。1. fopen 系列是标准的C库函数;open系列是 POSIX转载 2011-09-29 11:29:34 · 329 阅读 · 0 评论 -
同步/异步与阻塞/非阻塞的区别
我喜欢用自己的语言通过联系现实生活中的一些现象解释一些概念,当我能做到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别.这两组概念常常让人迷惑,因为它们都是涉及到IO处理,同时又有着一些相类似的地方.首先来解释同步和异步的概念,这转载 2011-09-28 20:33:38 · 395 阅读 · 0 评论 -
Linux下关于时间概念的C语言编程
Abstract 在程序中,经常需要输出系统的当前时间、计算程序的执行时间、使用计时器等。Introduction一、时间的类型1.格林威治标准时间 coordinated universal time(UTC)是世界标准时间,即常说的格林威治标准时间(转载 2011-09-27 10:12:16 · 493 阅读 · 0 评论 -
设置vim语法高亮显示和自动缩进
一、、首先,确认你的linux系统是否安装了功能完整的且足够新的vim。安装vim:# sudo apt-get install vim-full 二、接下来设置vim的配置文件 1、配置文件的位置在目录 /etc/vim 下面,有个名为vimr转载 2011-09-27 23:13:03 · 404 阅读 · 0 评论 -
size_t与ssize_t
ssize_t是什么类型的?解释一:为了增强程序的可移植性,便有了size_t,它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。 在32位系统上 定义为 unsigned int 也就是说在32位系统上是32位无符号整形。在64位系统转载 2011-09-26 20:31:53 · 327 阅读 · 0 评论 -
gch文件
gcc会预编译头文件成gch文件以节省编译时间,如果改变了头文件源码而不重新编译的话,gcc还会使用老的gch文件。但是当加选项-E只做预编译的时,gcc会使用最新的头文件源码。这样就产生了编译生成的结果与预编译生成的结果不一样的现象。来源:http://hi.bai转载 2011-10-14 15:53:20 · 1836 阅读 · 0 评论 -
宋敬彬-linux网络编程 cs例子
客户端:#include #include #include #include #include #include #include #define PORT 8888void process_conn_client(int s);int main(int ar转载 2011-09-28 16:20:59 · 1917 阅读 · 0 评论 -
recv/recvfrom/recvmsg系统调用
功能描述: 从套接字上接收一个消息。对于recvfrom 和 recvmsg,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。如果消息太大,无法完整存放在所提供的缓冲区转载 2011-10-08 06:20:03 · 556 阅读 · 0 评论 -
关于数据类型
在进一步讨论更深的主题之前,我们需要先停一停,快速地回顾一下可移植问题。Linux1.2版本和2.0版本之间的不同就在于额外的多平台能力;结果是,大多数源代码级的移植问题已经被排除了。这意味着一个规范的Linux驱动程序也应该是多平台的。 但是,与内核代码转载 2011-10-10 13:51:23 · 629 阅读 · 0 评论 -
Linux下Socket编程中用send发送结构体
Linux网络通信 Linux下多客户端聊天软件 最近在开发一个Linux下的聊天软件,好久没有做C语言的开发了,感觉到很多东西已经生疏了,这下又碰到用Socket传递结构体的问题,google了一下,发现也有不少朋友遇到同样的问题,所以就打算写出自己的解决办法,跟大家分享转载 2011-10-09 21:33:19 · 716 阅读 · 1 评论 -
深入UNIX编程:一个简单聊天室的两种实现 (fcntl 和 select)
在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。聊天室的实现方法有很多,但都是利用所谓的“多用户空间”来对信息进行交换,具有典型的多路I/O的架构。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点转载 2011-10-19 01:13:04 · 593 阅读 · 0 评论 -
linux tcp并发式服务器应用SELECT函数编写实例源代码(转载)
#include #include #include #include #include #include #include #include #include #define MYPORT 1234 // the port user转载 2011-10-18 23:50:15 · 4338 阅读 · 0 评论 -
Linux下的段错误(segmentation fault)产生的原因及调试方法
简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表转载 2011-10-17 17:25:34 · 864 阅读 · 0 评论