linux 编程
文章平均质量分 70
knight_yzzz
专注于android的爱好者
展开
-
什么是“门”
本地过程调用都是同步的,但是,线程被认为是某种形式的异步调用:一个函数被pthread_create调用,看起来是一起执行,但是调用者需通过pthread_join等待这个线程结束。远程过程调用(RPC)通过门实现,在进程内看,门是描述符标示的,在进程外,门是用文件系统中的路径标示。与回调有啥不同?在服务器端,先创建门,传入的是要异步调用的函数指针,返回的是门的标示描述符。使用前面说的路径原创 2014-01-26 10:16:19 · 908 阅读 · 0 评论 -
shell 1
#!/bin/bash # “#! 称为sha-bang符号,shell脚本的起始符号,特殊标记 之后是一个路径名指示了解释器在系统中的位置”cd #切换到根目录..bash_profiledatewho #当前登录用户ls -l /etc/sh*;date;who #控制台中有多个命令,用分号隔开编写完脚本后需赋予 x 权限 chmod u+x wholog.s原创 2012-09-23 17:54:24 · 365 阅读 · 0 评论 -
pcap 3
#include #include #include #include #include int main(void){ char *net_dev; char *ip_addr; char *net_mask; char errbuf[PCAP_ERRBUF_SIZE]; bpf_u_int32 netp; bpf_u_int32 maskp;原创 2012-09-20 21:14:46 · 474 阅读 · 0 评论 -
PACP (1)
#include #include #include //其中,user作为用户自定义的数据,//传入给callback的args参数,callback将监听到的数据和信息分别存入packet和header。void deal_with_packet(u_char *user, const struct pcap_pkthdr *hdr, const u_char *packe原创 2012-09-20 21:02:45 · 802 阅读 · 0 评论 -
pacp 网络数据包抓取
我们可以分5个步骤来描述使用libpcap编写程序的步骤:我们首先要决定监听的设备接口,这个可以用一个string来表示,也可以由pcap提供给我们。 初始化pcap。我们要告诉pcap需要监听的是哪一个设备。pcap对于不同的设备,使用session来区分它们,一个设备就是一个“session”。 我们需要创建一个监听的原则(rule),然后编译它,提供给pcap作为一个sess原创 2012-09-20 20:27:47 · 898 阅读 · 0 评论 -
poll
poll系统调用poll()系统调用是System V的多元I/O解决方案。它解决了select()的几个不足,尽管select()仍然经常使用(多数还是出于习惯,或者打着可移植的名义):用户空间调用的poll函数定义如下:#includesys/poll.h>int poll (struct pollfd*fds, unsigned int nfds,原创 2012-09-17 21:50:08 · 543 阅读 · 0 评论 -
server select
#include #include #include #include #include #include #include #include #include #include #include static int forward_port;#undef max#define max(x,y) ((x) > (y) ? (x) : (y))原创 2012-09-17 21:22:18 · 457 阅读 · 0 评论 -
UDP
客户端:#include #include #include #include #define UNIX_DOMAIN "unix.domain"int main(void){ int com_fd; int ret; char snd_buf[1024]; int i; static struct sockaddr_un srv_addr; s原创 2012-09-17 23:02:23 · 415 阅读 · 0 评论 -
pselect
进程阻塞于select 导致EINTR错误。 很久以来,同事写的一个模块,与串口收发数据的时候,SELECT()函数等待的时间长点,就会被模块里设置的时钟信号打断,最近看到了一个新的函数pselect(),研究了一把,收获不小!!现在发现,SELECT()函数等待的这段时间内不想被别的信号打断的方法有两其一:用pselect()函数#include #incl转载 2012-09-17 21:34:25 · 555 阅读 · 0 评论 -
select( 1)
非阻塞 I/O 经常使用 poll(System V)、select(BSD Unix)、 epoll(linux2.5.45开始)系统调用。select()的调用形式为: #include #include int select(int maxfd, /*要被检测的比特数,待检测的最大文件描述符大1*/原创 2012-09-17 20:57:50 · 1165 阅读 · 0 评论 -
sem 信号量
#include #include #include #include #define NBUFF 100int nitems;sem_t mutex;sem_t nempty;sem_t nstored;int buff[NBUFF];void *produce(void *arg){ int i; for (i = 0; i转载 2012-10-06 22:10:57 · 610 阅读 · 0 评论 -
pthread_sigmask
#include #include #include #define NUMTHREADS 3void sighand(int signo);void *threadfunc(void *parm){ pthread_t tid = pthread_self(); int rc; p原创 2012-10-06 21:20:29 · 928 阅读 · 0 评论 -
pthread_once
/*** once_run()函数仅执行一次,且究竟在哪个线程中执行是不定的,尽管pthread_once(&once,once_run)出现在两个线程中*/#include #include pthread_once_t once=PTHREAD_ONCE_INIT;void once_run(void){ printf("once_ru原创 2012-10-06 15:33:26 · 888 阅读 · 0 评论 -
pthread_key_create
/* * int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)) * * 该函数从TSD池中分配一项,将其值赋给key供以后访问使用。如果destr_function不为空,在线程退出(pthread_exit())时将以key所关联的数据为参数调用destr_function(),以释放分原创 2012-10-06 17:57:04 · 2232 阅读 · 0 评论 -
pthread_cond_signal
/* * #define pthread_cleanup_push(routine,arg) \ * { struct _pthread_cleanup_buffer _buffer; \ * _pthread_cleanup_pu转载 2012-10-06 17:37:39 · 579 阅读 · 0 评论 -
pthread_join
#include #include #include struct thread_param{ char info; int num;};void* thread_fun(void* param){ struct thread_param* p; p=(struct thread_param*)param; int i; printf转载 2012-10-06 17:14:44 · 567 阅读 · 0 评论 -
automake
# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.59)AC_INIT(test, 1.0, normalnotebook@126.com)AC_CONF转载 2012-10-06 10:09:20 · 423 阅读 · 0 评论 -
linux list 内核链表
struct list_head {struct list_head *next, *prev;};static inline void INIT_LIST_HEAD(struct list_head *list){list->next = list;list->prev = list;}和外部数据没关系,只是节点指针的改变。static inline void原创 2013-04-04 12:29:40 · 1050 阅读 · 1 评论 -
TCP穿透技术
其实很早我就已经实现了使用TCP协议穿透NAT了,但是苦于一直没有时间,所以没有写出来,现在终于放假有一点空闲,于是写出来共享之。一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技术,基本上没有人会告诉你如何使用TCP协议去穿透(甚至有的人会直接告诉你TCP协议是无法实现穿透的)。但是,众所周知的是,UDP是一个无连接的数据报协议,使用它就必须自己维护收发数据包的完整性,这转载 2013-04-23 08:16:29 · 1170 阅读 · 0 评论 -
rpc远程调用一些看法
本地过程调用都是同步的,但是,线程被认为是某种形式的异步调用:一个函数被pthread_create调用,看起来是一起执行,但是调用者需通过pthread_join等待这个线程结束。远程过程调用(RPC)通过门实现,在进程内看,门是描述符标示的,在进程外,门是用文件系统中的路径标示。与回调有啥不同?在服务器端,先创建门,传入的是要异步调用的函数指针,返回的是门的标示描述符。使用前面说的路径原创 2013-12-01 12:23:06 · 728 阅读 · 0 评论 -
pthread
#include #include #include #include#include time_t end_time={0};sem_t sem1,sem2;int lock_var=0;void pthread1(void * arg);void pthread2(void *arg);void pthread3(void *arg);pthread原创 2013-09-12 11:40:13 · 853 阅读 · 0 评论 -
一道面试题
#include #include #include time_t end_time={0};sem_t sem1,sem2;int lock_var=0;void pthread1(void * arg);void pthread2(void *arg);int main(int argc,char *argv[]){ pthread_t id1,id原创 2013-09-11 17:39:22 · 830 阅读 · 0 评论 -
pthread_join 和pthread_detach
有的编码器会在每个关键帧前加VOS 头. | 帧头StartCode 0x00, 0x00, 0x01 | VOPStartCode | 帧类型 | 没有帧头或者没有VOPStartCode 在过滤时此帧要被抛弃,不是关键帧的要被过滤。在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回转载 2013-09-10 17:38:23 · 1422 阅读 · 0 评论 -
UDP组播接收端解析
网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组播组的数据报,那么这么主机必须先加入该组播组,然后就可以从组地址接收数据包。在广域网中,还涉及到路由器支持组播路由等,但本文希望以一个最为简单的例子解释清楚协议栈关于组播的一个最为简单明了的工作过程,甚至,我们不希望涉及到 IGMP包。 我们先从一个组播客户端的应用程序入手来解析组播的工作过程: #inc转载 2013-09-10 15:06:40 · 1305 阅读 · 0 评论 -
linux socket timewait连接错误情况
写程序,经常碰见这种情况,主要是有一方关闭SOCKET,但是另外一方没有检测到,导致没有检测到的一方出现CLOSE_WAIT的情况.eg:[oracle10@RHEL3 cc]$ netstat | grep 6800tcp 55 0 RHEL3:6800 192.168.1.35:34575 CLOSE_WAITtcp转载 2013-08-27 11:09:32 · 1666 阅读 · 0 评论 -
linux 从业者技能要求
熟悉TCPIP协议栈, 音视频处理.嵌入式Linux内核裁剪、移植、驱动的开发优化.精通JAVA线程、IO等,对android的framework层有深刻认识,熟悉android的服务机制、进程间通信机制,了解JNI以及NDK等技术。 8.Android binder开发经验,Android 网络套接字、本地套接字开发经验,有过阅读 Android 窗口管理(WM)、消息循环(EL原创 2013-06-13 20:15:25 · 1206 阅读 · 1 评论 -
TCP握手过程
封装: 将上层交给自己的数据包(泛指各种PDU)放进一个或多个本层能理解的数据包的Data部分,并为这些数据包填充适当的头部字段信息,然后将装配好的数据包交给下一层。解封装:从下层接过本层能理解的数据包,然后去掉本层的数据包头部字段,将Data 部分传给上一层。 )TCP 协议三次握手过程的描述:过程简述:1)服务器应用启动,建立相应的TCB,进入LISTEN状态;2)客户端向原创 2013-05-31 12:25:48 · 730 阅读 · 0 评论 -
信号驱动I/O实例
4,信号驱动I/O :让内核在描述字就绪时发送SIGIO信号通知我们。首先开启套接口的信号驱动1/O功能,sigaction系统调用安装一个信号处理函数,当内核数据包准备好时,会为该进程产生一个SIGIO信号。应用可以在信号处理时接收数据。 具体步骤:1,建立SIGIO信号处理函数。 2,设置该套接口的属主,通常使用fcntl的F_SETOWN命令设置。 3,开启该套接口的信号驱动原创 2013-06-23 19:16:43 · 4801 阅读 · 0 评论 -
I/O 复用
I/O 复用 以下场合:1,多监听接口。 2,既要处理TCP,又要处理UDP。 3,多服务,多个协议。 I/O 模型有以下几种: 1,阻塞I/O :缺省情况下,所有套接口都是阻塞的,如 进程阻塞于recvfrom 调用。recvfrom和recv都可以接受面向连接和无连接的套接字,如果socket为阻塞的,在没有数据时,都将阻塞。 2,非阻塞型I/O :当所有请原创 2012-09-17 20:42:32 · 1451 阅读 · 0 评论 -
getsocket /setsocket/fcntl
函数原型为: #include int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);Return: 0 if OK, –1 on erro这个函数用于获得socket的各种特性,即socket options. 结果放在函数的后两个参数中,这两个参数是val原创 2013-06-23 11:55:30 · 2289 阅读 · 0 评论 -
栈回溯技术
栈回溯技术arm_v5t_le版From:韦东山 2007.04.03栈回溯技术及uClibc的堆实现原理.doc1. 前言段错误、非法地址访问等问题导致程序崩溃的现象屡屡发生,如果能找到发生错误的函数,往往一眼就能看出BUG所在——对于这类比较简单的问题,比如使用空指针进行读写等,利用栈回溯技术可以很快定位。但是对于数组溢出、内存泄漏等问题导致的程序错误,往往隐藏很深,它们并不转载 2013-06-06 20:38:24 · 8266 阅读 · 0 评论 -
Linux系统调用
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。按照惯例,这个列表以manpages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不答应用户调用的系统调用,对个别转载 2013-03-07 23:00:17 · 644 阅读 · 0 评论 -
linux 线程等待队列
pthread_cond_signal不会有“惊群现象”产生,他最多只给一个线程发信号假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。但无论如何一个pthread_cond_signal调用最多发信一次。pthread_cond_wait必须放在pthre原创 2013-05-09 20:14:36 · 2181 阅读 · 0 评论 -
管道通讯
1.管道(pipe)和有名管道(FIFO ):管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。(1)无名管道由pipe()函数创建:int pipe(int filedi原创 2013-05-18 17:05:31 · 530 阅读 · 0 评论 -
gdb debug
break functiongdb core core 是程序非法执行后 core dump 文件gdb pid 如果你的程序是一个服务程序,指定这个服务运行时的进程ID GDB 自动attach并调试catch 捕捉程序运行时的一些事件,如:载入共享库(动态链接库) 或者 c++的异常load 加载库文件condition 修改断点号为bnum的停止条件为expre原创 2012-10-06 16:37:07 · 396 阅读 · 0 评论 -
select and epoll
关于select函数:其函数原型为:int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);此函数的功能是由内核检测在timeout时间内,是否有readfds,writefds,exceptfds三个句柄集(file descriptors)里的转载 2012-09-16 23:02:13 · 738 阅读 · 0 评论 -
Program received signal SIGSEGV, Segmentation fault.
Program received signal SIGSEGV, Segmentation fault.wo们知道SIGSEGV默认handler的动作是打印”段错误"的出错信息,并产生Core文件,lihacker@lihacker-laptop:~$ ulimit -c0lihacker@lihacker-laptop:~$ ulimit -c 1000lihacker@l原创 2012-08-26 22:10:47 · 5929 阅读 · 2 评论 -
exit
setnonblocking - 设置句柄为非阻塞方式*/int setnonblocking(int sockfd){ if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1) { return -1; } return 0;}/*atex转载 2012-09-04 22:32:33 · 506 阅读 · 0 评论 -
client (1)
/* client.c */#include #include #include #include //#include "wrap.h"#define MAXLINE 80#define SERV_PORT 8000int main(int argc, char *argv[]){ struct sockaddr_in servaddr; char b转载 2012-09-04 21:59:59 · 403 阅读 · 0 评论 -
epoll
epoll的工作原理是,你如果想进行IO操作时,先向epoll查询是否可读或可写,如果处于可读或可写状态后,epoll会通过epoll_wait函数通知你,此时你再进行进一步的recv或send操作。epoll仅仅是一个异步事件的通知机制,其本身并不作任何的IO读写操作,它只负责告诉你是不是可以读或可以写了,而具体的读写操作,还要应用层自己来作。epoll仅提供这种机制也是非常好的,它保持了事转载 2012-09-04 21:41:00 · 490 阅读 · 0 评论