APUE
文章平均质量分 71
RichardYSteven
这个作者很懒,什么都没留下…
展开
-
设置 询问 /dev/net/tun的设备特性
#include #include #include #include #include #include #include static struct {unsigned int flag;const char *name;} known_flags[] = {{ IFF_TUN, "TUN" },{ IFF_TAP, "TAP" },{转载 2011-12-14 13:31:23 · 4319 阅读 · 0 评论 -
Unix Domain Socket的例子
下面是unix domain socket的服务器端和客户端的两个代码。/* * ===================================================================================== * * Filename: unix_socket_serv.c * * Description: * * Version: 1.0 * Created: 09/09/2原创 2010-09-09 22:28:00 · 7567 阅读 · 0 评论 -
使用unix domain socket传递file descriptor的例子
<br />刚抄完,先贴上来吧。慢慢再分析。<br /> <br />#include <apue.h><br />#include <errno.h><br />#include <fcntl.h><br />#include <unistd.h><br />#include <sys/uio.h><br />#include <sys/socket.h><br /><br />#define CL_OPEN "open"<br />#define CS_OPEN "/tmp/原创 2010-09-12 22:08:00 · 2156 阅读 · 1 评论 -
signal handling in thread
线程中的信号处理比进程中信号处理更复杂。APUE中建议使用一个单独的进程来同步的处理(等待)信号的到来,而其他的线程则block所有的信号。下面这是一个简单的例子。 需要注意的是:使用sigwait前,需要先block想要等待的信号,否则会产生窗口,而丢失信号。#include #include int quitflag = 0;sigset_t mask;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;pthre原创 2010-08-22 22:23:00 · 1083 阅读 · 0 评论 -
pthread_cleanup_push 和 pthread_cleanup_pop
<br />pthread_cleanup_push的作用和atexit()的作用是一样的。<br /> <br />在线程执行下列操作时,注册的函数将会执行。<br /> <br />Makes a call to pthread_exit<br />Responds to a cancellation request<br />Makes a call to pthread_cleanup_pop with a nonzero execute argument<br /> <br />值得注原创 2010-08-19 15:40:00 · 1216 阅读 · 0 评论 -
Create a thread under linux
<br />使用pthread_create()创建一个线程。<br />在linux下有几点注意的。<br /> <br />1. 编译时,加上-pthread 选项,查看man gcc<br />2. <br /> <br />输出结果为<br />main thread: pid 19475 tid 3086771904 (0xb7fc66c0)<br />new thread: pid 19475 tid 3086769040 (0xb7fc5b90)<br />可以看到pid是一样的了。原创 2010-08-19 13:59:00 · 1296 阅读 · 0 评论 -
daemon
下面的代码给出了如何创建一个守护进程。这个是没有sleep的结果$./daemon father : pid = 22957, ppid = 10927, pgrp = 22957, sid = 10927, tpgrp = 22957child before setsid : pid = 22958, ppid = 22957, pgrp = 22957, sid = 10927, tpgrp = 22957child after setsid : pid =原创 2010-08-18 16:44:00 · 801 阅读 · 0 评论 -
使用condition variable实现线程之间同步
<br />发现了,这个condition variable真是个好东西啊。<br /> <br />先上代码:<br />#include <pthread.h><br />#include <syslog.h><br />#include <fcntl.h><br />#include <sys/resource.h><br />#include <sys/types.h><br />#include <sys/stat.h><br />#include <signal.h><b原创 2010-08-19 16:05:00 · 1070 阅读 · 0 评论 -
process VS thread API
process和thread之间有很多共同的地方,也就是说有不少功能类似的api函数。这里做个比较。Process primitiveThread primitiveDescriptionforkpthread_createcreate a new flow of controlexitpthread_exitexit from an existing flow of controlwaitpidpthread_joinget exit status from flow of controlatexitpt原创 2010-08-19 15:11:00 · 1011 阅读 · 0 评论 -
计算网络速度
<br />/*<br /> * =====================================================================================<br /> *<br /> * Filename: net_speed.c<br /> *<br /> * Description: <br /> *<br /> * Version: 1.0<br /> * Create原创 2010-08-16 21:53:00 · 945 阅读 · 0 评论 -
列出目录下的文件
#include #include /* free() */#include int main(void) { struct dirent **filelist = {0}; char *directory = "."; int fcount = -1; int i = 0; fcount = scandir(directory, &filelist, 0, alphasort); if(fcount perror(directory); return 1原创 2010-06-25 15:39:00 · 732 阅读 · 0 评论 -
Resource limits of Process
<br />每个进程都有自己的资源的限制,可以用getrlimit and setrlimit修改<br /> <br /> <br />下面这个代码显示了当前进程的资源情况。 <br /> <br />/*<br /> * =====================================================================================<br /> *<br /> * Filename: process_limit.c<原创 2010-08-13 13:58:00 · 796 阅读 · 0 评论 -
Reliable Signal VS Unreliable Signal
从APUE的书上看,不可靠信号会造成两种情况1. signals could get lost2. difficult for a process to turn off selected signals when executing critical regions of code.但是我还是有点晕,我想弄明白几点1. 不可靠信号的表现是什么样子的?2. 为什么会有不可靠信号? 内核的原因? 应用程序的原因?3. 如何避免不可靠信号?下面这段话摘自http://tldp.org/LDP/lpg/nod原创 2010-08-13 10:56:00 · 1522 阅读 · 0 评论 -
使用信号signal,实现进程之间的同步
<br /> <br />下面是具体的代码,其中四个函数是重点。 <br />TELL_WAIT, WAIT_PARTEN, TELL_PARTEN, WAIT_CHILD, TELL_CHILD。<br />TELL_WAIT是用来初始化信号掩码的。至于为什么要block SIGUSR1 和 SIGUSR2我还不清楚。<br />其余四个就是两对,用来等待和告知。<br />关键的是两个<br />1.用了一个static volatile sig_atomic_t sigflag 变量来做flag。<b原创 2010-08-12 15:14:00 · 1973 阅读 · 0 评论 -
两个版本的system 第二个版本用sigaction设置了信号处理
书中实现了两个版本的system函数,第二个版本中队信号进行了处理。忽略了SIGINT和SIGQUIT,阻塞了SIGCHLD。#include #include #include #include #include #include #include #include #include #include intsystem1(const char *cmdstring) /* version without signal handling原创 2010-08-09 17:34:00 · 1104 阅读 · 0 评论 -
Shared Memory Example
<br />http://www.cs.cf.ac.uk/Dave/C/node27.html<br /> <br />/*<br /> * =====================================================================================<br /> *<br /> * Filename: shm_server.c<br /> *<br /> * Description: <br /> *原创 2010-09-03 13:51:00 · 1063 阅读 · 0 评论 -
strtok函数
<br />这函数蛮诡异的<br /> <br />#include <stdio.h><br />#include <string.h><br /><br />int main ()<br />{<br /> char str[] ="- This, a sample string.";<br /> char * pch;<br /> printf ("Splitting string /"%s/" into tokens:/n",str);<br /> pch = s原创 2010-09-13 20:59:00 · 800 阅读 · 0 评论 -
FIFO 的使用
<br />FIFO是IPC的一种形式。他和pipe不一样,pipe只能用在有关联的进程之间,而FIFO可以用在任意的进程之间。 <br /> <br />下面是一个server和client的例子。<br />1. FIFO是半双工的<br />2. 这个是可以block的<br />3. 打开fifo的时候,必须是只读或者只写,不能既读又写。<br /> <br />/*<br /> * ========================================================原创 2010-09-02 11:42:00 · 1379 阅读 · 0 评论 -
epoll example
https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/转载 2011-12-21 21:41:12 · 1040 阅读 · 0 评论 -
用ioclt 来设置路由
#include #include #include #include #include #include #include int main(char** args) { int sockfd; struct rtentry route; struct sockaddr_in *addr; int err = 0; // create the socket if((sockfd = socket(AF_INET, SO原创 2011-05-31 17:13:00 · 1368 阅读 · 0 评论 -
bsearch and qsort
<br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br /><br />struct mi {<br /> int nr;<br /> char *name;<br />} months[] = {<br /> { 1, "jan" }, { 2, "feb" }, { 3, "mar" }, { 4, "apr" },<br /> { 5, "原创 2011-01-25 17:02:00 · 905 阅读 · 0 评论 -
一个 select函数的例子
<br />其实这个例子是从man 里面拷贝出来的。 稍加修改而已。<br /> <br />重要的一点是让我理解了这个函数的第一个参数一定要比想要询问的fd多1!<br />经过测试,select确实调用到了 file_operations 结构中的 poll。 这点和poll的机制是一样的。<br />/*<br /> * =====================================================================================<br原创 2010-11-25 21:52:00 · 892 阅读 · 0 评论 -
A poll() example
<br />这是一个简单的poll函数的例子。 用来检测/dev/scullpipe0设备是否可读。 <br /> <br />从console中可以看出,当调用了poll后,.poll函数被调用到了。<br /> <br />#include <poll.h><br />#include <stdio.h><br />#include <fcntl.h><br /><br />int main()<br />{<br /> struct pollfd fda原创 2010-11-25 15:14:00 · 1972 阅读 · 0 评论 -
Raw socket Example
http://www.tenouk.com/Module43a.html原创 2011-01-11 17:09:00 · 1825 阅读 · 0 评论 -
文件异步读写
文件异步读写在应用程序侧,使用SIGIO的信号来处理。1. 设置接受SIGIO信号的函数。2. F_SETOWN3. FASYNC在驱动侧,需要fasync函数来处理。/* * ===================================================================================== * * Filename: async.c * * Description: this program test the原创 2010-11-26 10:28:00 · 1090 阅读 · 0 评论 -
A small library for database
这个东东也挺强劲的不过我还有些问题1. 如果打开时oflag中有O_TRUNC, 且有用户正在读取该数据库,数据库文件会被删掉?原创 2010-09-16 17:13:00 · 988 阅读 · 0 评论 -
Terminal Window: disable the interrupt character
<br />这个例子也很好玩,相应的位置设置成_POSIX_VDISABLE就可以把相应的字符disable掉。<br /> <br />/*<br /> * =====================================================================================<br /> *<br /> * Filename: disable_interrupt.c<br /> *<br /> * Descript原创 2010-09-15 16:15:00 · 1037 阅读 · 0 评论 -
一个函数,可以在输入密码时,不现实密码
<br />这个功能挺好玩的撒<br /> <br />/*<br /> * =====================================================================================<br /> *<br /> * Filename: getpass.c<br /> *<br /> * Description: <br /> *<br /> * Version: 1.0<br原创 2010-09-15 14:20:00 · 913 阅读 · 0 评论 -
Get terminal window size
<br />下面这个代码是用来获取当前terminal window的大小的<br />1. 用ioctl来获取大小<br />2. 当窗口大小变化时,会收到SIGWINCH的信号<br /> <br />/*<br /> * =====================================================================================<br /> *<br /> * Filename: window_size.c<br原创 2010-09-15 13:51:00 · 1625 阅读 · 3 评论 -
使用mmap复制文件
<br />mmap可以将相应的文件描述的内容映射到内存中,读取内存就相当于读取文件了。<br /> <br />下面这个例子,注意看不同的文件使用的不同的flag。<br /> <br />#include <sys/types.h><br />#include <sys/stat.h><br />#include <unistd.h><br />#include <stdio.h><br />#include <string.h><br />#include <stdlib.h><b原创 2010-08-31 15:16:00 · 1696 阅读 · 0 评论 -
Example for Message Queue
http://www.cs.cf.ac.uk/Dave/C/node25.html下面是一个利用message queue实现ipc的例子。要注意的是,当进程退出后,message queue仍然存在。/* * ===================================================================================== * * Filename: message_send.c * * Description原创 2010-09-02 14:28:00 · 1090 阅读 · 0 评论 -
File Types in Unix System
<br />在unix系统中文件分成了其中类型。<br />Regular file. The most common type of file, which contains data of some form. There is no distinction to the UNIX kernel whether this data is text or binary. Any interpretation of the contents of a regular file is left to原创 2010-09-01 10:15:00 · 728 阅读 · 0 评论 -
sigsuspend 将重设signal mask和等待合成原子操作
<br />先来看一段代码<br /> sigset_t newmask, oldmask;<br /><br /> sigemptyset(&newmask);<br /> sigaddset(&newmask, SIGINT);<br /><br /> /* block SIGINT and save current signal mask */<br /> if (sigprocmask(SIG_BLOCK, &newmask原创 2010-08-10 16:12:00 · 1063 阅读 · 0 评论 -
sigpending显示当前进程有哪个信号被pending
<br />The sigpending function returns the set of signals that are blocked from delivery and currently pending for the calling process. <br />就是说,返回的信号,是被已经产生,但因为被block而没有deliver的。<br /> <br />#include <stdio.h><br />#include <unistd.h><br />#includ原创 2010-08-10 14:54:00 · 2432 阅读 · 1 评论 -
设置 和 显示 当前进程的signal mask
<br />使用函数sigprocmask()可以设置,和显示当前进程的signal mask。<br /> <br />int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);<br />其中的how可以有三中选择。<br /> <br /> <br />SIG_BLOCK<br />The new signal mask for the process原创 2010-08-10 14:38:00 · 1435 阅读 · 0 评论 -
linux上c语言 获得网络接口的统计值
这个东东,蛮好玩的。其实就是读取了/proc/net/dev 文件。 struct netdev_stats { unsigned long long rx_packets_m; /* total packets received */ unsigned long long tx_packets_m; /* total packet原创 2010-03-11 16:23:00 · 3034 阅读 · 0 评论 -
mmap共享内存
http://blog.csdn.net/adcxf/archive/2009/03/14/3989725.aspx 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制转载 2010-02-11 22:42:00 · 3449 阅读 · 0 评论 -
gettimeofday
#include #include #include #include int main(void){ char buffer[30];转载 2009-11-29 12:26:00 · 867 阅读 · 0 评论 -
Random Numbers in Linux
------------------------------------------------------------#include #include #include #include #include #include "head.h" #define RANG 3600.0 int m原创 2009-11-17 08:47:00 · 917 阅读 · 0 评论 -
获取文件大小,尤其是超过2G的大文件
#define _FILE_OFFSET_BITS 64#include #include #include long long get_file_size(const char *filename){ struct stat buf; if(stat(filename, &buf) {原创 2009-09-20 16:17:00 · 2509 阅读 · 0 评论