- 博客(40)
- 收藏
- 关注
原创 进程组,作业,会话,精灵进程
1. 进程组每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止
2016-07-31 18:06:52
617
原创 死锁的产生和预防死锁
1,死锁的定义:死锁是指多个进 程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。2,死锁产生的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。3,死锁产生的必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
2016-07-28 20:34:03
683
原创 线程安全与可重入
线程安全:一个函数被称为线程安全的当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。任何线程不安全问题的根源都是“共享数据”。所以,不使用任何共享数据的函数(即:可重入函数)肯定是线程安全的。但这并不等于说,线程安全函数就是可重入函数。为什么呢?因为即使有线程有共享数据,线程被并发调用的时候产生的结果可以是正确的。那么这种正确性是如何保证的呢?对,就是通过同步操作。可重入:当被
2016-07-27 16:34:28
444
原创 阻塞信号和捕捉信号
一 阻塞信号1 概念:信号递达:实际执行信号的处理动作称为信号递达(Delivery)。信号未决:信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block )某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。每个
2016-07-27 00:10:59
2150
原创 Linux中的mmap函数
1,mmap函数功能mmap函数为内存映射函数。负责把文件内容映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。注意:mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。2,mmap
2016-07-25 12:20:35
1327
原创 进程调度算法
一,进程调度的原因无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。二,进程调度方式1. 非抢占式优先权算法在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或
2016-06-17 14:59:27
750
原创 我的第一个Linux小程序(进度条)
一,预备知识 在写进度条之前,先要对printf函数有一个更深的理解与认识,看一个简单的程序:(1)运行后先输出“hello world”,再睡眠三秒(2)去掉\n以后,按照预期,应该先输出hello world,再睡眠3秒,可是结果却是睡眠3秒后再输出hello world,这是为什么呢?其实呢printf函数是先把内容写到行缓冲区,遇到\n或者是行缓
2016-06-02 20:04:06
3898
原创 make,makefile和程序的编译链接过程
一,Linux下程序运行过程 1,在一个目录下新建三个文件:main.c hello.c hello.h分别编写他们如下图: 2,想要让这个程序执行起来,就必须对上面的三个文件分别进行编译链接执行,如下图: 通过上面这个过程。我们可以大致总结一下gcc编译器把目标文件经过预处理,编译,汇编,链接生成可执行文件的过程和命令: (1)预处理(宏替换,删除注释和多余的空白字
2016-06-02 12:00:18
15115
2
原创 Centos中vim的配置
一,vim简介 多模式编辑器,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、 windows。1、vim的基本概念 基本上vim可以分为三种状态(其实有好多模式,目前掌握这3种即可),分别是命令模式、插入模式和底行模式,各模式的功能区分如下:1) 命令行模式command mode) 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert
2016-06-02 10:45:34
495
原创 文件名查找指令find
一,文件查找命令 在linux下有相当优异的查找命令。那怎么查找一个文件的存放路径呢?通常我们会用到下面这三个命令: which 查看可执行文件的位置。 whereis 查看文件的位置。 locate 配合数据库查看文件位置。 find 实际搜寻硬盘查询文件名称。 通常我们先使用前面三个命令来进行查找,如果真的找不到。再使用find命令来查找。因
2016-06-02 10:45:31
830
原创 Linux基础(一)
第一部分:计算机1,计算机硬件的五大单元:(1)输入单元:包括键盘,鼠标,扫描仪,手写板等。(2)中央处理器(CPU):含有算术逻辑,控制,记忆等单元。(3)输出单元:显示器,打印机。2,计算机的处理过程:650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/7F/FA/wKiom1czAPHhHTLdAAASWj65LCs555.pn
2016-06-02 10:45:28
351
原创 栈求解迷宫问题
求迷宫从入口到出口的所有路径是一个经典的程序设计问题。一般的设计思想就是从入口出发,顺着某个方向向下探索,探索分为上下左右四个方位,哪个方向是通的就将向下走,如果每个方向都走不下去就进行原路“回退”。所以需要一个后进先出的结构来保存从入口到出口的路径。所以运用栈来实现是非常方便的,沿着某个方向走,将每个可通的位置进行入栈标记,再切换到下个位置;如果都不通,则栈顶出栈取消标记,再寻找。下来呢就实现一
2016-06-02 10:45:25
697
原创 智能指针和异常
今天让我们来分析一下C++中的智能指针和异常,首先呢先普及一下概念!(1)智能指针:智能或者自动化的管理指针所会向的动态资源的释放。(2)异常:当一个函数发现自己无法处理的错误时,让函数的调用者直接或间接的处理这个问题。(3)RAII:资源分配即初始化。构造函数完成对象的初始化,析构函数完成对象的清理,而不是删除。在实际写代码过程中,我们很容易写出存在异常的代码,不信来看看下面几个例子 :void
2016-06-02 10:45:22
659
原创 数组和指针再次来袭
1,数组和指针的定义于声明:定义:只能出现一次,用来确定对象的类型和大小,并为其分配空间。声明:可以出现多次,描述对象的类型,用于指定其他地方定义的对象,不为对象分配空间。所以说extern char a[]与extern char a[10]等价,因为这是声明,不分配空间。看一个关于数组指针的例子:例1:#includeint main(){ char a[5] = { 'A', 'B',
2016-06-02 10:45:19
303
原创 数组和指针
1,一维数组 先看一下一个整型数组关于数组名的表达式在内存中所占的字节数#include#includeint main(){ int a[] = { 1, 2, 3, 4 }; printf("%d\n", sizeof(a)); // 16 在sizeof中,数组名a不发生降级,代表整个数组 printf("%d\n", sizeof(a+0)); // 4 在sizeo
2016-06-02 10:45:16
364
原创 模拟实现strstr,strcpy,strlen,strcat,strcmp,memcpy,memmove
1,模拟实现strstrstrstr为字符串查找函数,其原型为:char *strstr( const char *string, const char *strCharSet );这个函数就是在string中寻找是否含有子字符串strCharSet,寻找过程两个都不需要发生改变,所以将它们声明为const常量。返回值为char *这样可以方便链式访问。代码实现如下:#include#inclu
2016-06-02 10:45:14
472
原创 模拟实现strstr
模拟实现strstr:在系统库函数中,存在strstr函数,它用于查找子字符串。它的函数原型为:char *strstr( const char *string, const char *strCharSet );这个函数中是要从*string中查找*strCharSet子字符串。因为只是查找,这两个字符串都不用发生改变,所以将他们声明为常量字符串。模拟实现strstr:#include#inc
2016-06-02 10:45:10
374
原创 模拟实现strncat
模拟实现strncat:在系统库函数中,存在strncat这个函数,它用于字符串的追加,就是在一个字符串后面再追加一个字符串,它的函数原型为:char *strncat( char *strDest, const char *strSource, size_t count );在其中,*strDest为目标字符串,*strSource为源字符串,count为需要追加的字符串的个数,strncat就
2016-06-02 10:45:08
475
原创 判断一个字符串是否为另外一个字符串旋转之后的字符串。
判断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAAAABCD右旋一个字符得到DAABCAABCD右旋两个字符得到CDAAB方法(1):用库函数实现,代码如下:#include#include#includeint
2016-06-02 10:45:05
431
原创 实现一个函数,可以左旋字符串中的k个字符
实现一个函数,可以左旋字符串中的k个字符例如:AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAA方法(1):采用循环移位,对需要旋转的k个字符按顺序进行旋转,先将要旋转的一个字符保存起来,将后面的往前挪动一位,再将保存起来的这个字符赋给最后一位,这样连续循环k次,就可以完成了。代码实现如下:#include#include#includevoid left_move(c
2016-06-02 10:45:02
1006
原创 宏定义
可以使用#define伪指令定义一个宏,宏分为带参数的宏和不带参数的宏。宏定义以#define关键字后面第一个出现的第一个连续字符序列作为宏,剩下的部分作为宏体。宏定义具有文件作用域,不论宏定义出现在文件中的那个地方(如函数体内,类型定义内部,名字空间内部等),在它后面的任何地方都可以引用宏。宏的特点和注意事项:(1)宏定义的不是语句,因此不需要使用语句结束符“;”,否则它会被看做宏的一部分。#d
2016-06-02 10:44:59
373
原创 在屏幕上输出图案
在屏幕上输出图案:#define _CRT_SECURE_NO_WARNINGS#include #include int main(){int line = 0;int i = 0;scanf_s("%d", &line);for (i = 0; i < line; i++){int j = 0;for (j = 0; j < line - 1 - i; j++){pr
2016-06-02 10:44:56
443
1
原创 编写程序数一下1到100的所有整数中出现多少次数字9
编写程序数一下1到100的所有整数中出现多少次数字9:#define _CRT_SECURE_NO_WARNINGS#include #include int main(){int i = 0;int count = 0;for (i = 0; i <= 100; i++){if (i % 10 == 9){count++;}if (i / 10 == 9){coun
2016-06-02 10:44:53
451
原创 计算1/1-1/2+1/3-1/4+1/5...+1/99-1/100的值
计算1/1-1/2+1/3-1/4+1/5...+1/99-1/100的值分析:根据题意可以知道,这个必须设为浮点型。#define _CRT_SECURE_NO_WARNINGS#include #include int main(){int i = 0;double sum = 0.0;int flag = 1;for (i = 1; i <= 100; i++){sum
2016-06-02 10:44:50
817
原创 输出一个整数的每一位
输出一个整数的每一位:递归调用#define _CRT_SECURE_NO_WARNINGS#include#includevoid print(int num){if (num >= 10)print(num / 10);printf("%d", num % 10);}int main(){int num = 10;scanf_s("%d", &num);print(n
2016-06-02 10:44:47
351
原创 从键盘输入一个字符,按要求输出
从键盘输入一个字符,若输入为小写字符,输出对应的大写字符;若输入为大写字符,输出对应的小写字符;若输入数字,则不输出。分析:其中将ch定义为int型是因为这样它的返回值范围就够大,EOF在内存中存储时它的值为-1。#define _CRT_SECURE_NO_WARNINGS#include#includeint main(){int ch = 0;while ((ch = getch
2016-06-02 10:44:44
2242
原创 求两个数的最大公约数
求两个数的最大公约数:用辗转相除法#define _CRT_SECURE_NO_WARNINGS#include#includeint main(){int num1 = 0;int num2 = 0;scanf_s("%d%d", &num1, &num2);while (num1%num2){int r = num1%num2;num1 = num2;num2 = r;
2016-06-02 10:44:41
313
原创 将三个数从大到小输出
将三个数从大到小输出:方法1:创建临时变量#define _CRT_SECURE_NO_WARNINGS#include#includeint main(){int a = 0, b = 0, c = 0;int tmp = 0;scanf_s("%d%d%d", &a, &b, &c);if (a < b){tmp = a;a = b;b = tmp;}if (a <
2016-06-02 10:44:38
577
原创 交换两个数组的内容
交换两个数组的内容:#define _CRT_SECURE_NO_WARNINGS#include#includeint main(){int arr1[10] = {1,2,3,4,5,6,7,8,9,0};int arr2[10] = {0,9,8,7,6,5,4,3,2,1};int i = 0;for (i = 0; i < sizeof(arr1) / sizeof(ar
2016-06-02 10:44:35
359
原创 求10个数中的最大值
求10个数中的最大值:求数组长度:sizeof(arr) / sizeof(arr[0])#define _CRT_SECURE_NO_WARNING#include#includeint main(){int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };int i = 0;int max = arr[0];for (i = 1; i <
2016-06-02 10:44:32
469
原创 输出九九乘法口诀表
输出九九乘法口诀表#define _CRT_SECURE_NO_WARNING#include#includeint main(){int i = 0;int j = 0;for (i = 1; i <= 9; i++){for (j = 1; j <= i; j++){printf("%d*%d=%2d ", i, j, i*j);}printf("\n");}s
2016-06-02 10:44:29
565
原创 求100-200之间所有的素数
输出100-200之间的素数,素数就是其约数只有1和它本身的数。分析:为了尽量缩短循环的次数,通过分析可以得到只要对该数除以从2到该数开平方就可以判断出这个数是不是素数了。#define _CRT_SECURE_NO_WARNINGS#include #include #includeint main(){int i = 0;int count = 0;for (i = 101;
2016-06-02 10:44:26
914
原创 猜数字游戏
猜数字游戏,根据程序提示,程序自动生成一个0-100之间的数,用户输入0-100之间任意一个数,通过比较,输出“你猜大了”,“你猜小了”,“恭喜你,猜对了!”。#define _CRT_SECURE_NO_WARNINGS#include #include #include void print_menu(){printf("**********************\n");pr
2016-06-02 10:44:23
517
原创 模拟用户登录系统
模拟用户登录系统,并且只允许输入3次密码,如果输入正确,登录成功;如果输入错误,登录失败。分析:在这个程序中用到了字符串比较函数strcmp(s,t),根据s指向的字符串小于(st)》t指向的字符串的不同情况,分别返回负整数,0或正整数。在运用这个函数时要添加头文件#include。#define _CRT_SECURE_NO_WARNINGS#include#include#include
2016-06-02 10:44:20
1206
原创 输出一个数的二进制序列中的奇数位和偶数位
输出一个数的二进制序列中的奇数位和偶数位分析:(1)运用右移运算符‘>>’,右移一位相当于除以2,右移后并不会影响数值本身。(2)一个数占4个字节,32个bit位,将它右移偶数位后剩余的部分再与1进行按位与,得到奇数位。(3)将它右移奇数位后剩余的部分再与1进行按位与,得到偶数位。#define _CRT_SECURE_NO_WARNINGS#include#includeint main(
2016-06-02 10:44:17
584
原创 写一个函数返回参数二进制中1的个数
写一个函数返回参数二进制中1的个数分析:(1)输入一个数(2)判断它是否为0。(3)如果不为0,就对它进行模2取余,模2的过程就相当于把这个数向右移除了一位,如果余数为1,则证明移除的这一位为1,就将其记录下来。如果余数为0,就证明移除的这一位为0,就不记录。(4)经过第3步以后,对这个数进行除2取整,再进入到第2步中。如此循环,直到第3步中判断为0。注意:(1)对于负数,在内存中是以其补码形式存
2016-06-02 10:44:14
1617
原创 求一元二次方程的根
判别一元二次方程ax^2+bx+c=0根的情况并求根。分析:(1)当b^2-4ac=0,方程有两个相等的实根,x1=x2=-b/2a。(2)当b^2-4ac>0,方程有两个不相等的实根,x1=(-b+√(b^2-4ac))/(2a),x2=(-b-√(b^2-4ac))/(2a)。(3)当b^2-4ac需要注意:(1)方程的根可能是小数,所以在定义变量时不能用整型,可以用浮点型或者double型。
2016-06-02 10:44:11
975
原创 判断1000年-2000年之间的闰年
判断1000年-2000年之间的闰年(1)程序中定义了一个变量flag,当flag=1时,表示输入的年份是闰年;当flag=0时,表示输入的年份不是闰年。(2)程序中运用了“与”运算符&&,它表示同时满足前后两个约束。#includeint main(){int year;int flag=0;scanf("year\n");for(year=1000;year<=2000;year+
2016-06-02 10:44:08
575
原创 C语言基础知识
通过这两天对基础知识的学习,对C语言中一些基本的知识有了更多的理解。就所学的做以下小结:1,注释:/*.....*/ 在C语言中,注释比较灵活,可以放在任何位置,在预处理时注释被替换成一个 空格,所以并不会影响整个程序的执行。但值得注意的是,注释是不能嵌套使用的。例如像这样的程序是错误的:例1:#includeint main(){/*/*注释*/int a=0;*/return
2016-06-02 10:44:05
623
原创 交换两个数的C语言程序
今天是第一次接触C语言,之前有一点C++的基础,所以学习起来还挺顺手的。下来分享一下写的一个关于交换两个数的C语言代码。可能这些还存在很大的问题,希望大家可以指正。方法一:允许创建第三个变量#includeint main(){ int a=10; int b=20; int tmp=a; a=b; b=tmp; printf("
2016-06-02 10:44:02
909
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人