导航

2012年1月5日

摘要: 也许有不少读者从本系列文章一推出就开始读,一直到这里还有一个很大的疑惑:既然所有新进程都是由fork产生的,而且由fork产生的子进程和父 进程几乎完全一样,那岂不是意味着系统中所有的进程都应该一模一样了吗?而且,就我们的常识来说,当我们执行一个程序的时候,新产生的进程的内容应就是程 序的内容才对。是我们理解错了吗?显然不是,要解决这些疑惑,就必须提到我们下面要介绍的exec系统调用。1.10.1 简介说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是:#include <unistd.h> int ... 阅读全文

posted @ 2012-01-05 11:16 网名还没想好 阅读(253) 评论(0) 推荐(0) 编辑

2012年1月4日

摘要: sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源, sleep是静态方法,是谁调用的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleepsleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu 阅读全文

posted @ 2012-01-04 22:18 网名还没想好 阅读(3806) 评论(2) 推荐(0) 编辑

摘要: 与fork()函数有所不同,fork()函数在创建一个子进程后,子进程的地址空间完全和父进程分开。父子进程是两个独立的进程,接受系统调度和分配的机会均等。因此父进程和子进程更像是一对兄弟。 而vfork()函数不同,vfork()函数产生的子进程和父进程完全共享地址空间,包括代码段,数据段和堆栈段。子进程对这些共享资源的修改会影响父进程,vfork()产生的更像是一个线程。再者,vfork()函数产生的进程一定比父进程先运行,子进程运行完了以后,父进程再运行。 看段代码:#include<stdio.h>#include<stdlib.h>#include<uni 阅读全文

posted @ 2012-01-04 21:28 网名还没想好 阅读(364) 评论(0) 推荐(0) 编辑

2012年1月3日

摘要: 一、fork入门知识一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 我们来看一个例子:view plain/**fork_test.c*version1*Createdon:2010-5-29*Author:wangth*/#include<unis 阅读全文

posted @ 2012-01-03 15:29 网名还没想好 阅读(354) 评论(0) 推荐(0) 编辑

2012年1月2日

摘要: $?是Linucx shell中的一个内置变量,其中保存最近一次运行的进程的返回值。这个返回值有以下三种情况。1,程序的main函数运行结束,$?保存main函数的返回值。2,程序运行中调用exit函数结束执行,$?中保存exit的参数。3,程序异常退出,$?保存异常的出错号。#include<stdio.h>int main(){ruturn 5;}运行该代码后,执行echo ¥?,显示:5$?内置变量中的1表示shell运行程序出错,在shell默认的路径找不到指定的程序。所以在编写代码时如果没有出错,则不要用main函数return 1 或者exit(0)这样的写法,以免引起 阅读全文

posted @ 2012-01-02 18:45 网名还没想好 阅读(515) 评论(0) 推荐(0) 编辑

2011年12月30日

摘要: 本贴涉及的硬件平台是X86,如果是其它平台,嘻嘻,不保证能一一对号入座,但是举一反三,我想是完全可行的。 一、概念 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。 ——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到 最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与 地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理.. 阅读全文

posted @ 2011-12-30 21:58 网名还没想好 阅读(508) 评论(0) 推荐(0) 编辑

2011年12月28日

摘要: 《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序废话就不说了,直接代码#include<stdio.h>union key{int a;char s[2];}Q;int main(){Q.a=0x4142;printf("%c\n%c",Q.s[0],Q.s[1]);return 0;}执行结果:B A。X86体系是小端模式的,比如0X8975,则89存在大地址端,而75存在小地址端,与我们*惯相*。由于union共享内存,所以就输出了B A 阅读全文

posted @ 2011-12-28 23:04 网名还没想好 阅读(350) 评论(0) 推荐(0) 编辑

2011年12月24日

摘要: 一,内存对齐1,分析需不需要对齐,只需要看到底会不会影响访问次数。2,内存对齐是一种典型的空间换时间的方法。3,对齐的原则是: 1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。struct SByte1 { double d; // 偏移量0~7 char j; // 偏移量8 ... 阅读全文

posted @ 2011-12-24 15:30 网名还没想好 阅读(628) 评论(0) 推荐(0) 编辑

2011年12月23日

摘要: 一,符号解析规则声明表示告知编译器该变量的存在,如:int a;而定义不仅告知编译器该变量的存在,还同时为该变量赋值,如:int a=9;在声明时不为该变量分配存储空间,定义时会为其分配内存空间。当该变量在其作用域内只有声明没有定义时,编译器会自动将第一个声明认为是该变量的定义,如:int f(int b){int a;//此时由于在该函数内找不到a的定义,因此该声明被认为是变量的定义,分配了四个字节的内存空间a=3;//此时不是定义,而是赋值。return a+b;}对结构体的赋值,比如typedef struct{int a;} SS;SS i={3};//正确,用{3}对结构体i进行初始 阅读全文

posted @ 2011-12-23 22:52 网名还没想好 阅读(398) 评论(0) 推荐(0) 编辑

摘要: 回调函数的另一个典型的作用是实现类似C++的泛型算法。如qsort的实现等等。 下面是我利用回调函数的特性来写的一个泛型函数,该函数的功能是在任意一组对象中求出其最大值,该对象可以是char型,也可以是int型......不多说了,直接看程序吧:#include <stdio.h>typedef int (*cmp_t) (void*, void*);/* 回调函数1: 对比的是char类型对象 */int cmp_char_data(void* a, void* b){ char para1 = *((char*)a); char para2 = *((char*)b); if( 阅读全文

posted @ 2011-12-23 21:55 网名还没想好 阅读(449) 评论(0) 推荐(0) 编辑