Unix/Linux
文章平均质量分 81
Ginvar
这个作者很懒,什么都没留下…
展开
-
recvmsg和sendmsg函数
这两个函数是最通用的I/O函数。实际上我们可以把所有read、readv、recv和recvfrom调用替换成recvmsg调用。类似地,各种输出函数调用也可以替换成sendmsg调用。 #include ssize_t recvmsg(int sockfd,struct msghdr *msg,int flags); ssize_t sendmsg(int sockfd,s原创 2013-08-19 18:26:52 · 1662 阅读 · 0 评论 -
connect的UDB套接字
首先,罗列几个即将用到的自定义函数。以下是Read函数原型:ssize_tRead(int fd, void *ptr, size_t nbytes){ ssize_t n; if( (n = read(fd, ptr, nbytes)) == -1) err_sys("readerror"); return(n);}以原创 2013-08-19 18:26:54 · 687 阅读 · 0 评论 -
select与pselect的信号屏蔽
pselect() 函数的原型是:int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);它和 select() 函数基本相同,区别在于两个不同的原创 2013-08-19 18:26:46 · 1248 阅读 · 1 评论 -
给套接字设置超时检测
在涉及套接字I/O操作上设置超时的方法有以下3种。调用alarm,它在指定超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在read或write调用上。使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。这个方法原创 2013-08-19 18:26:56 · 1087 阅读 · 0 评论 -
避免僵死进程
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始原创 2013-08-19 18:26:59 · 514 阅读 · 0 评论 -
高级轮询技术——/dev/poll接口与kqu…
这里介绍两种机制,它们跟select和poll这两个函数具备类似的特性。/dev/poll接口Solaris上名为/dev/poll的特殊文件提供了一个可扩展的轮询大量描述符的方法。select和poll存在的一个问题是,每次调用它们都得传递待查询的文件描述符。轮询设备能在调用之间维持状态,因此轮询进程可以预先设置好待查询描述符的列表,然后进入一个循环等待事件发生,每次循环回来时不必再次设原创 2013-08-19 18:26:48 · 3651 阅读 · 2 评论 -
套接字和标准I/O
我们经常使用也称为UNIXI/O——包括read、write这两个函数及它们的变体(recv、send等等)——的函数执行I/O。这些函数围绕描述符工作、通常作为UNIX内核中的系统调用实现。执行I/O的另一个方法是使用标准I/O函数库。标准I/O函数库可用于套接字,不过需要考虑以下几点。通过调用fdopen,可以从任何一个描述符创建出一个标准I/O流。类似地,通过调用fileno,原创 2013-08-19 18:26:50 · 1073 阅读 · 0 评论 -
哈夫曼编码
思想:得到哈夫曼树后,自顶向下按路径编号,指向左节点的边编号0,指向右节点的边编号1,从根到叶节点的所有边上的0和1连接起来,就是叶子节点中字符的哈夫曼编码。下图体现了哈夫曼编码的过程: #include stdio.h>#include stdlib.h>#include string.h>//哈转载 2014-02-13 12:36:53 · 661 阅读 · 0 评论