`

学习init所用到的C语言知识

 
阅读更多
  C语言库函数名: atoi
  功 能: 把字符串转换成整型数.
  名字来源:array to integer 的缩写.
  原型: int atoi(const char *nptr);
  函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。
  头文件: #include <stdlib.h>
  程序例:
  1)

  2)  


  C语言库函数名:strchr

  原型:extern char *strchr(const char *s,char c);

  const char *strchr(const char* _Str,int _Val)
  char *strchr(char* _Str,int _Ch)
  头文件:#include <string.h>
  功能:查找字符串s中首次出现字符c的位置
  说明:返回首次出现c的位置的指针,如果s中不存在c则返回NULL。
  返回值:Returns the address of the first occurrence of the character in the string if successful, or NULL otherwise
  举例1:(在Visual C++ 6.0中运行通过)
  举例2:
  举例3:
C语言函数名:mmap

mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。

用法

参数
  start:映射区的开始地址。
  length:映射区的长度。
  prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
  PROT_EXEC //页内容可以被执行
  PROT_READ //页内容可以被读取
  PROT_WRITE //页可以被写入
  PROT_NONE //页不可访问
  flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体
  MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。
  MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
  MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
  MAP_DENYWRITE //这个标志被忽略。
  MAP_EXECUTABLE //同上
  MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。
  MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。
  MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。
  MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。
  MAP_ANON //MAP_ANONYMOUS的别称,不再被使用。
  MAP_FILE //兼容标志,被忽略。
  MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。
  MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。
  MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。
  fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为-1。
  offset:被映射对象内容的起点。
返回说明
  成功执行时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回MAP_FAILED[其值为(void *)-1],munmap返回-1。errno被设为以下的某个值
  EACCES:访问出错
  EAGAIN:文件已被锁定,或者太多的内存已被锁定
  EBADF:fd不是有效的文件描述词
  EINVAL:一个或者多个参数无效
  ENFILE:已达到系统对打开文件的限制
  ENODEV:指定文件所在的文件系统不支持内存映射
  ENOMEM:内存不足,或者进程已超出最大内存映射数量
  EPERM:权能不足,操作不允许
  ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志
  SIGSEGV:试着向只读区写入
  SIGBUS:试着访问不属于进程的内存区
mmap设备操作
  mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。
编辑本段其他
  munmap执行相反的操作,删除特定地址区域的对象映射,基于文件的映射,在mmap和munmap执行过程的任何时刻,被映射文件的 st_atime可能被更新。如果st_atime字段在前述的情况下没有得到更新,首次对映射区的第一个页索引时会更新该字段的值。用 PROT_WRITE 和 MAP_SHARED标志建立起来的文件映射其st_ctime 和 st_mtime,在对映射区写入之后但在msync()通过MS_SYNC 和 MS_ASYNC两个标志调用之前会被更新

#define中的 #与##

#define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename
  在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。
  

C语言库函数名:MEMCPY

概述

memcpy()函数可用来拷贝任意类型的数据

函数原型

#include <string.h>

void *memcpy(void *destination, void *source, unsigned int count);

详细描述

由source所指内存区域复制count个字符串到destination所指内存区域.

* memcpy() 是用来做内存拷贝:
* 可以用来拷贝任何数据类型的对象,而不像strcpy()函数那样仅限于字型.
* 可以指定拷贝的数据长度.
* source和destination所指内存区域不能重叠.
* 如果不指定memcpy()函数要拷贝的字节数,函数将以null字符结束。因为并不是所有的数据都以null字符结束,所以最好为memcpy()函数指定要拷贝的字节数。
* 如果拷贝不成功,函数返回NULL指针。所以在调用该函数时应该检测返回值是否为NULL再执行相应的操作。

返回值

若拷贝成功,函数返回指向destination的指针。 若拷贝不成功,函数返回NULL指针。

用法示例

fork()函数 Linux
  #include<unistd.h>
  #include<sys/types.h>
  函数定义:
  pid_t fork( void);
  (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)
  返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
  函数说明:
  一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
  子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
  linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。
  为什么fork会返回两次?
  由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因为fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

调用fork之后,代码有两份,都从fork函数中返回,箭头表示各自的执行处
  示例代码:





分享到:
评论

相关推荐

    Eeprom的c语言编程.rar

    这是用单片机调试过的C语言程序!!!这是用单片机调试过的C语言程序!!!

    基于C语言实现的aes256加密算法示例

    本文实例讲述了基于C语言实现的aes256加密算法。分享给大家供大家参考,具体如下: aes256.h: #ifndef uint8_t #define uint8_t unsigned char #endif #ifdef __cplusplus extern C { #endif typedef struct { ...

    android系统.rc文件学习包含init.rc,init.usb.rc,init.zygote64.rc,init-debug.rc,ueventd.rc

    Android Init Language是android系统很重要的组成 文件来自于\system\core\rootdir 里面有init.rc,init.usb.rc,init.zygote64.rc,init-debug.rc,ueventd.rc

    ymodem发送代码(c语言)

    1、ymodem发送代码(c语言),网上大多只有接收代码,有也是写得比较乱,此代码小巧便于移植到小系统。 2、优点:io可自定义,注释清晰,传输效率高,短小精炼。

    工资管理系统c语言

    float Init_Salary; //应发工资 float Water_Rate; //水费 float Electric_Rate; //电费 float tax; //税金 float Final_Salary; //实发工资 }SI[MAX]; //SI[MAX]中每个数组元素对应一个职工工资信息

    C语言图书管理系统 大学C语言项目作业

    C语言编写的图书管理系统,项目作业 #include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt; #include&lt;ctype.h&gt; #define STACK_INIT_SIZE 10 #define OK 1 #define TRUE 1 #define ...

    C语言做的九宫盒游戏

    void inIt(); int getBoxNumber(char *number); void setBox(int i,int j,char *number); void disBox(int yX,int yY); void moveBox(int nX,int nY); int cheakBoxL(int l); int cheakBoxH(int h); int cheakBox();...

    c语言浪漫烟花源码.rar

    void Init_Fire(); // 初始化烟花 void Load_Image(); // 加载烟花图片 void Shoot(); // 发射烟花 void Chose(DWORD& t1); // 筛选烟花 void Show(DWORD* pMem); // 绽放烟花 ...

    Linux init详解

    Linux init详解

    C语言数据结构迷宫问题

    //----------------- 栈的基本操作的算法实现 --------------------------------Status InitStack(SqStack &s)...{ s.base = (SElemType * ) malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!s.base) exit...

    深入剖析Android中init进程实现的C语言

    init是一个进程,确切的说,它是Linux系统中用户空间的第一个进程。由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程。init的进程号是1。作为天字第一号进程,init有很多重要的工作: ...

    c语言连接mysql数据库

    函数原型: MYSQL *mysql_init(MYSQL *mysql) 函数返回值: 一个被始化的MYSQL*句柄 备注: 在内存不足的情况下,返回NULL 所需头文件: #include 函数功能: 关闭一个服务器连接,并释放与连接相关的内存 函数...

    用C语言实现(块)队列

    在项目中已经使用的,用C语言实现块队列。 1、queue_dt_init初始化块队列。 2、 queue_dt_in将数据放入队列。 3、queue_dt_out从队列取出数据。

    C语言学生管理系统

    9 static int init(void); // 初始化函数 10 static void destroy_all(void); //销毁全部链表 11 int main(void) 12 { 13 int ret; 14 printf("\033[?25l"); 15 ret = init(); 16 if(ret != 0) 17 { 18 ...

    五子棋C语言-收藏学习备用基础项目.docx

    void initBoard() { for(int i = 0; i ; i++) { for(int j = 0; j ; j++) { board[i][j] = '+'; } } } void printBoard() { for(int i = 0; i ; i++) { for(int j = 0; j ; j++) { printf("%c ", board[i]...

    Android8.1 init进程学习

    本文档是基于Android8.1进行分析,对init进程的启动初始化工作进行了分析,包括解析init.rc配置文件,开启属性服务,开启socket监听子进程终止并处理,创建epoll_fd监听创建的其他fd,用来调用对应的处理函数;...

    linux init.d目录理解

    一起学习,一起进步。 “/etc/rc.d/init.d/目录下的脚本就类似与windows中的注册表,在系统启动的时候某些指定脚本将被执行”。开始之前,先引用李善明经理昨天晚上总结时的一个理解,让大家先对init.d目录有个大概...

    c语言五子其

    void init(); //初始化函数 void draw(int a, int b, int color); //画棋子函数 a表示行b表示列 color表示颜色 void gameover(); //游戏结束 int judge(int a, int b, int c); //判断是否有连续五个蓝棋子,a表示行...

    (C语言数据结构)单链表

    C语言实现单链表 Init(初始化) Length(当前结点个数) AddEnd(尾部添加) AddFirst(首部添加) Insert(插入) * Delete(删除) Find(查找返回) ShowAll(显示所有元素) Destory(销毁链表)

Global site tag (gtag.js) - Google Analytics