摘要:
使用select函数的套接字如果你想保持现有连接的同时,侦听新的连接,怎么办呢?普通的做法(使用recv, accept是做不到的)。当使用accetp等待新的连接时,程序是阻塞的,也就没办法再同原有连接保持通信。另一种做法是,使用非阻塞方式,但这会浪费了宝贵的CPU时间(你的不停的轮询轮询)。有没有更好的办法呢?答案是肯定的 – 使用select函数。select可以帮助你同时监听多个套接字。它会告诉你哪个套接字读数据就绪, 哪个套接字写数据就绪,哪个套接字发生错误。使用select意味着使用I/O多路技术。select函数头文件:#include <sys/time.h>#in 阅读全文
摘要:
InetdInternet超级服务器可以使用inetd来设计网路程序,使我们不用考虑复杂的socket编程。只要设计好通讯协定(需要什么样的输入什么样的输出)就好了。所需要的技巧,仅仅是文字分析技巧。利用inetd来开发网路应用步骤如下:设计好本地运行的程序(hello:是一个hello world!程序)配置inetd/etc/services: 配置程序使用的端口eg: hello 20001/tcp 其意义为hello这项服务是在端口20001、是一个TCP连接。/etc/inetd.conf: 配置连接上面的服务时要执行的程序eg: hello streamtcp nowait rob 阅读全文
摘要:
1 建立管道int pipe(int filedes[2]);pipe()会建立管道,并将文件描述符由参filedes数组返回filedes[0]为管道里的读取端,filedes[1]则为管道的写入端。下面的程序建立了两个管道,分别绑定到子进程父进程标准输入输出:View Code #include <unistd.h>#include <stdio.h>int main(){ int fdins[2], fdouts[2]; pid_t pid; char buff[20]={0}; pipe(fdins); pipe(fdouts); pid=f... 阅读全文
摘要:
信号是一种软件中断,程序收到信号时,就会调用相应的处理函数(如果有注册)。void (*signal(int signum,void(* handler)(int)))(int); -- 设置信号处理方式信号处理函数原型void foo(int arg);系统定义的信号有:/* Signals. */#define SIGHUP1/* Hangup (POSIX). */#define SIGINT2/* Interrupt (ANSI). */#define SIGQUIT3/* Quit (POSIX). */#define SIGILL4/* Illegal instruction (. 阅读全文
摘要:
守护进程是脱离终端并在后台运行的进程。守护进程脱离终端是为了避免进程在执行过程中的信息在任何终端上显示,并且进程也不会被任何终端所产生的中断信息打扰。守护进程一般生存周期都很长。一般都是默默的在后台做一些事情,用户不会直接感受到它的存在。创建守护进程的步骤1 与终端脱离创建子进程,父进程退出。2 在子进程中创建新会话意义在于:让守护进程独立让进程摆脱原会话的控制让进程摆脱原进程组的控制让进程摆脱原控制终端的控制那么,在创建守护进程时为什么要调用setsid函数呢?由于创建守护进程的第一步调用了fork函数来创建子进程,再将父进程退出。由于在调用了fork函数时,子进程全盘拷贝了父进程的会话期、 阅读全文
摘要:
<Uinx 环境高级编程笔记>当执行程序时,main函数时如何被调用的?C程序总是从main函数开始执行。当内核在启动C程序时,在调用main之前先调用一个特殊的启动例程。可执行程序将次启动例程指定为程序的起始地址 -- 这是由连接编辑程序设置的,而连接编辑程序则由C编译程序调用。启动例程从内核取得命令行参数和环境变量,然后为调用main函数做好安排。进程的终止1 正常终止 a) 从main返回 b)调用exit c)调用_exit exit先执行一些清理再进入内核。2 异常终止 a) 调用abort b)由一个信号终止在程序终止前可以调用其它函数,这可以通过int atexit 阅读全文
摘要:
<Uinx 环境高级编程笔记>以前经常遇到两种I/O操作一类是f打头的fopen, fread, fwrite一类是没有f打头的open, read, fwrite原来一个是UNIX I/O(在类Unix系统上实现),另一类是标准I/O(在很多系统上都有实现,包括windows)使用标准I/O的好处因为在出UNIX的很多操作系统(包括Windows, linux)上都实现了此库,所有有利于软件的移植。与UnixI/O的主要区别UNIX I/O的函数都是针对文件描述符的,而标准I/O的操作都是围绕流进行的。所为的流就是一个FILE *标准I/O提供了缓存--为了尽量减少write, 阅读全文
摘要:
<Uinx 环境高级编程笔记>文件的相关信息文件有哪些相关信息呢?用户关心的:文件类型、文件名、文件大小、文件目录、文件所有者、文件访问修改日期。这些信息保存在struct stat结构中(sys/stat.h)系统关心的:文件状态、文件的存储信息。系统相关的信息大部分在inode, vnode, 文件表中。获取stat结构的API: int stat(const char * file_name,struct stat *buf);使用stat函数最多的可能是 ls -l命令int lstat (const char * file_name.struct stat * buf); 阅读全文
摘要:
<Uinx 环境高级编程笔记>1 常用的I/O打开文件int open( const char * pathname, int flags);int open( const char * pathname,int flags, mode_t mode);返回值:文件描述符,一个整数。头文件:#include<sys/types.h> #include<sys/stat.h> #include<fcntl.h>第一个参数: 欲打开的文件路径flags: 访问模式,O_RDONLY, O_WRONLY, O_RDWR, O_CREAT,O_EXCL( 阅读全文
摘要:
用于测试排序算法的正确性和性能测试函数:View Code /* 分别测试 记录有序、反序、随机、所有元素相同的情况*/typedef void (*SortFun)(int *, int *);SortFun pFun;void OrderTest( int n){ clock_t start; float time_used; int *p = new int[n]; pFun = HeapSort; //ascending order int i=0; int flg; while (i<n) p[i] = i++... 阅读全文