摘要:typedef void (*fun)(void); 定义了一个函数指针,该函数的返回值是void,参数是void下面主要讨论上述语句的用法看下面的这个例子。#include typedef void (*fun)(void);void a(void){ printf("a\n");}void...
阅读全文
摘要:虽然原来也曾看过exit和return的区别,一直都认为这两者差不多,今天在写程序的时候突然发现原来差很多,唉,还是多写点程序好啊,奈何,曾认为自己写代码的水平已不是很差了,所以就写的较少了,看来还是不行的啊return与exit的区别是什么?exit()是一个函数,结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,在父进程中wait系统调用将接受到此返回信息。return返回函数值,是关键字在main函数中我们通常使用return (0);这样的方式返回一个值。 但这是限定在非void情况下的也就是void main()这样的形式。 exit()通常是用在子程序中用来终..
阅读全文
摘要:#include <stdio.h>#include <unistd.h>#include <signal.h>#include <string.h>#include <sys/time.h>#include <errno.h>void PrintMsg(int Num){ printf("%s\n", "Hello World"); return;}int main(int argc, char* argv[]){ signal(SIGALRM, PrintMsg); struct
阅读全文
摘要:sock_raw(注意一定要在root下使用)原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对于监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包,不能用IPPROTO_IP,因为如果是用了IPPROTO_IP,系统根本就不知道该用什么协议。2.socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧3.socket(AF_IN
阅读全文
摘要:AF表示ADDRESS FAMILY 地址族PF表示PROTOCL FAMILY 协议族但这两个宏定义是一样的所以使用哪个都没有关系Winsock2.h中#defineAF_INET 0#definePF_INETAF_INET所以在windows中AF_INET与PF_INET完全一样而在Unix/Linux系统中,在不同的版本中这两者有微小差别对于BSD,是AF,对于POSIX是PF在函数socketpair与socket的domain参数中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET.这几个参数有AF_UNIX=AF_LOCAL,
阅读全文
摘要:基于原始套接字编程 在开发面向连接的TCP和面向无连接的UDP程序时,我们所关心的核心问题在于数据收发层面,数据的传输特性由TCP或UDP来保证: 也就是说,对于TCP或UDP的程序开发,焦点在Data字段,我们没法直接对TCP或UDP头部字段进行赤裸裸的修改,当然还有IP头。换句话说,我们对它们头部操作的空间非常受限,只能使用它们已经开放给我们的诸如源、目的IP,源、目的端口等等。 今天我们讨论一下原始套接字的程序开发,用它作为入门协议栈的进阶跳板太合适不过了。OK闲话不多说,进入正题。 原始套接字的创建方法也不难:socket(AF_INET,SOCK_RAW,protoc...
阅读全文
摘要:tcp报文有tcp报文的首部ip报文有ip报文的首部两者的关系是tcp首部+tcp报文段的数据部分构成了ip数据报的数据部分,如果再加上ip数据报的首部就够成了ipstruct--ip_optionsstruct ip_options表示IP选项struct ip_options { __be32 faddr; unsigned char optlen; unsigned char srr; unsigned char rr; unsigned char ts; unsigned char is_data:1, is_strictroute:1, srr_is_hit:1, is_change
阅读全文
摘要:socket目 录socket 1.socket() 2.bind() 3.connect() 4.listen() 5.accept() 6.send() 和recv() 7.sendto() 和recvfrom() 8.close() 和shutdown() 9.getpeername() 10.gethostname()socketsocket()我们使用系统调用socket()来获得文件描述符:#include#includeint socket(int domain,int type,int protocol);第一个参数domain设置为“AF_INET”。第二个参数是套接口的类型
阅读全文
摘要:英语不会果然是硬伤啊,英文的看了半天,就是一点都看不懂啊,下面来用中文解释下这个函数把,汗Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include<stdio.h> #include<pthread.h> void *print_thread_id(void *arg) { /* 打印当前线程的线程号*/ printf("Current thread id is %u\n", (uns
阅读全文
摘要:知识背景:210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式。英语叫做IPv4 numbers-and-dots notation。如果把210.25.132.181转换为整数形式,是3524887733,这个就是整数形式的IP地址。英语叫做binary data。(其实binary是二进制的意思)问题所在:如何在字符串形式的IP和整数形式的IP之间转换呢?问题解决思路:有三个函数可以解决这个问题,当然不止这三个函数,只是这三个函数最常用且最易混淆。隆重推出他们:inet_network(), inet_addr(), inet_aton()!!三者定义:int in
阅读全文
摘要:/etc/rsyslog.d/50-default.conf找了好多次了
阅读全文
摘要:Vim作为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情。每当学会了vim的一个新功能,就会很大地提高工作效率。有人使用vim几十年,还没有完全掌握vim的功能,这也说明了vim的强大。而这样何尝不是一件好事呢,只要有的学习,就有的提高。 最近使用Vim来写博客,发现在Vim中粘贴Python代码后,缩进就全乱了。仔细研究了以下,原来是自动缩进的缘故,于是做如下设置::set noai nosi取消了自动缩进和智能缩进,这样粘贴就不会错行了。但在有的vim中不行,还是排版错乱。 后来发现了更好用的设置::set paste进入paste模式以后,可以在插入模式下粘贴内容,
阅读全文
摘要:今天又学习了当写程序要查找函数的时候可以用到强大的man使用man时可以指定不同的section来浏览,各个section意义如下:1 - commands2 - system calls3 - library calls4 - special files5 - file formats and convertions6 - games for linux7 - macro packages and conventions8 - system management commands记不住,每次都是1、2、3、4这样试的,总能找到自己想要的
阅读全文
摘要:转自:http://bluegene8210.is-programmer.com/posts/27873.htmlVim 的补全模式加速器,轻松玩转全部 15 种自动补全模式Jacky Liuposted @ 2011年7月06日 06:12 inVimwith tagsvimcompletion补全自动补全自动完成, 1739 阅读---- 这是两年前写的一个小工具,是为了学习掌握 Vim 的补全模式,也是为了用起来方便。在那之前,我对 Vim 的补全功能还只是稍微了解,从没用过,因为补全功能默认的按键都是 emacs 式的,太蛋疼了,觉得这样还不如直接手敲。但是后来开始越来越多地写代码(我
阅读全文
摘要:当一个任务(进程)执行系统调用而执行内核代码时,称进程处于内核内核态,此时处理器处于特权级最高的(0级)内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。当进程执行用户代码时,称其处于用户态,此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态,因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系,intel cpu提供Ring0-Ring3三种级别的运行模式,Ri
阅读全文
摘要:1. 更改用户ID和组ID1.1. 设置用户ID和设置组ID与进程相关联的ID有6个或更多,如下:实际用户ID我们实际上是谁实际组ID有效用户ID用于文件访问权限检查有效组ID附加组ID保存的设置用户ID由exec函数保存保存的设置组ID实际用户ID和实际组ID标识我们是谁。这两个字段在登录时取自口令文件中的登录项。有效用户ID、有效组ID和附加组ID决定了我们的文件访问权限。保存的设置用户ID和保存的设置组ID在执行一个程序时包含了有效用户ID和有效组ID的副本。当执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID就是实际组ID。但是如果在文件模式字(st_mode)中设
阅读全文
摘要:一个进程的 real user ID 是指运行此进程的用户角色的 ID。一个进程的 effective user ID 是指此进程目前实际有效的用户 ID(也就是权限的大小),effective user ID 主要用来校验权限时使用,比如打开文件、创建文件、修改文件、kill 别的进程,等等。如果一个进程是以 root 身份来运行的,那么上面这两个 ID 可以用 setuid/seteuid 随便修改,想怎么改就怎么改,改来改去都可以。但是如果一个进程是以普通用户身份来运行的,那么上面这两个 ID 一般来说是相同的,并且也不能随便修改。只有一种情况例外:此进程的可执行文件的权限标记中,设置了
阅读全文
摘要:文件的权限有rwx这3个读、写、执行的权限。但是,怎么 /tmp权限有些奇怪?还有, /usr/bin/passwd也有些奇怪,怎么回事呢?不是只有rwx吗?为什么还有其他的特殊权限呢?不要担心,我们这里先不谈这两个权限,只是先介绍一下而已。因为必须要有账号的ID概念,以及程序的进程(process)概念后,才能够进一步了解这些特殊权限所表示的意义。 Set UID会创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。举例来说,我们知道,账号与密码的存放文件其实是 /etc/passwd与 /etc/shadow.而 /etc/shadow文件的权限是“-r-
阅读全文
摘要:在书上看到一段话,描述进程的一生,感觉写的挺好的首先,随着fork的成功执行,一个新的子进程诞生,此时他还只是父进程的一个克隆,从父进程那里得到数据段和堆栈段的拷贝。然后随着exec,新的进程脱胎换骨,独立成家,看是独自执行一个全新的程序,并完全代替原有的父进程。人有生老病死,进程也一样,他可以是自然死亡,即运行到main函数的最后一"}",从容的离我们而去;也可以自杀,自杀有两种方式,第一种是调用exit函数,一种是在main函数内使用return,无论哪一种方式,他都可留下遗书,放在返回值里保存下来,;他甚至还可能被杀,被其他进程通过另外一些方式结束他的生命。进程死掉时
阅读全文
摘要:在网上找了很多资料,大致上就下面这几点吧1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值并退出函数2,return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。3,exit函数是退出应用程序
阅读全文