




已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2013 - 7 - 2链表的增删效率高,查询效率低;数组效率均衡。算法:排序 冒泡 (相邻比较,前比后大,交换)选择 (依次选择最小的,和对应下标交换)插入 (逐次把第二到第n 个元素插入到前面n-1个元素)快速 ()查找 顺序 (1 n)二分 (从一半开始) ,针对有序Minix (Mini UNIX) ,简化版的unix系统。Fedora 稳定性好。gcc -v 察看gcc版本。.h 预处理 后的文件 gcc -E -o xx.cgcc -Wall 察看更多的警告。#warning 产生一个警告。#error 产生错误。#pragma 提供一些额外功能。_LINE_ 输出行号。 /当前目录中查找。gcc -i 头文件目录 /可以指定任意位置的头文件。系统目录中查找。配置环境变量 CPATH或C_INCLUDE_PATH也可以找到。#pragma GCC dependency 文件名 /控制文件的时间先后,比较指定文件和代码文件哪个更新,若指定文件更新产生警告。#pragma GCC poison 标识符/关键字 /禁用一些关键字或标识符#pragma pack(n) /设置结构体的对齐和补齐方式。配置PATH方法:在bash, vi 登陆目录下的 .bashrc或.bash_profile,最后加上:export PATH=.:%PASH保存推出。.代表当前目录,:代表不同目录分隔符。$PATH代表把原来的PATH 接过来,避免覆盖系统命令。效果在重启后有效,source .bashrc。创建静态库:库文件就是 .o文件的 集合。Unix/Linux,提供两种库,共享库和静态库。静态库: .a ;共享库: .so静态库 是代码的复制过程,共享库 是留下函数的地址。连接静态库,可执行文件比较大,修改后需要重新连接,不利于维护和更新。好处是独立,可执行文件在运行时,不需要再次访问静态库。使用共享库,可执行文件小,修改后不一定重新连接,便于维护和更新。不独立, 可执行文件运行时,需要多次访问共享库。一般开发中,使用共享库。静态库和共享库的生成和调用:静态库的生成和调用:1、写源代码,保存推出。2、编译源代码,生成 .o文件。 gcc -c3、打包 生成 静态文件ar -r lib名字.a add.o (所有.o文件)静态库文件名组成: lib开头,.a结尾,中间放名字。静态库的调用步骤:1、写调用源程序(test.c)2、编译 调用的源程序3、连接 调用和静态库三种方式:a)gcc test.o libxx.a(就是直接把文件名放在一起)b)先配置环境变量LIBARY_PATH,把库文件所在的路径配好。然后用gcc test.o -l xx (lib和.a省略)。c)直接连用:gcc test.o -l xx -L 库文件所在路径。注:开发 给别人提供 头文件+库文件即可。共享库的生成步骤:1、写源程序2、编译源程序,生成.o文件。gcc -c -fpic add.c3、生成 共享库文件。gcc -shared add.o -o libmyku.so共享的使用步骤:和静态库完全一样。注:共享库的执行需要配置 环境变量LD_LIBRARY_PATH,否则./a.out运行不起来export LD_LIBRARY_PATH=.2013 - 7 - 4#include /库 dl:动态库 /非重点void *dlopen(const char *filename, int flag);/打开共享库,加载,参数:共享库名,加载方式:RTLD_LAZY 延时加载,何时用何时加载。RTLD_NOW 立即加载,不管现在用不用。返回 一个 打开的共享库 的首地址 (void *)。void *dlsym(void *handle, const char *symbol);/查找要调用的函数,参数:打开的共享库(dlopen的返回)。函数名。返回 函数指针。int dlclose(void *handle);/关闭共享库,参数:打开的共享库。char *dlerror(void);/无错误,返回空,检测dl系列函数是否出错,不出错返回NULL。注:连接时 需要加 -ldl, 不需要配置环境变量。ldd a.out /察看a.out相关的共享库。C程序员处理错误的方法:1、返回值代表出错,指针类型,NULL代表出错;2、返回int类型,并且返回数据不可能是负数,-1代表出错。3、返回int类型,数据可能是负数,数据将不再用return返回,而是用指针取得,同时返回-1代表出错,返回0代表正常。4、返回不需要处理错误,可以返回void。C语言中,错误的存储方式,没中错误都有自己的编号和信息,编号在外部全局变量,(来自其他文件)errno,编号对应信息的函数:strerror 传入error,返回char*(错误信息)。perror 显示错误的信息。不用你传入error,自己找,但可以加上额外的信息。errno.h和stdio.hprintf(%m) %m 就代表 错误字符串信息,不需要传参。errno只有在出错时候改值,成功不修改,因此不可用errno判断是否成功。errno是一个全局变量,因此随时可能改变。errno 并非适合所有函数,有些函数不用。使用外部全局变量,要加extern关键字。extern char* environ;/预先定义好的变量,直接使用。字符串数组,就是首地址,extern 表示来自其他文件。字符串数组以NULL结束。2013 - 7 - 5信息管理系统(文件版)(数据库版)char* p;*p+5/走了5个字节;p+5/走了5个字符串。环境变量和环境表getenv 取得环境变量,按照环境变量名可以取得。setenv 新增/修改环境变量,设置是否替换。putenv 新增/修改环境变量,固定会替换。unsetenv 删除环境变量,按照环境变量名删除。clearenv 清楚所有环境变量。数据结之映射: 存储一对数据,映射(Map)前面叫key(键),后面叫value(值),这一对数据叫键值对。int setenv(const char *name, const char *value, int overwrite);/overwrite覆盖。用法实例:#include #include int main() extern char* environ; char* value = getenv(LANG); printf(value = %sn, value); putenv(VAR=ABC); printf(VAR = %sn, getenv(VAR); putenv(VAR=123); printf(VAR = %sn, getenv(VAR); setenv(VAR, 456, 0);/设置0,不修改 printf(VAR = %sn, getenv(VAR); setenv(VAR, 456, 1);设置1,修改 printf(VAR = %sn, getenv(VAR); clearenv();/不要参数 printf(VAR = %sn, getenv(VAR); unsetenv(VAR);/需要传入参数名 printf(VAR = %sn, getenv(VAR); Unix/Linux的内存分配方式:STL 内存自动分配。 | v C+内存用new分配,用delete回收。 | v C用malloc分配,用free回收。 | v Unix系统函数 brk/sbrk。 | v Unix系统函数 mmap/munmap(仅限Unix/Linux),用户层。 内核系统函数 kmalloc,vmalloc 内核层 | v get_free_page()程序:储存在硬盘上的文件(a.out)进程:运行在内存中的程序。执行起来的程序叫 进程。又是统称程序。操作系统内存里只有进程。一个进程的内存空间的划分:1、代码区:存储程序执行的代码,函数在此,只读区。2、全局区:保存全局变量或static变量,正常区域,main函数执行前分配。3、BSS段:保存未初始化的全局变量,main函数执行前自动请0.4、栈区, 保存局部变量,包括形参,自动管理内存。5、堆区:程序员控制,malloc/free管理。6、只读区:和代码区非常近,存储 字符串常量和其他常量。大项目,多个功能,多个模块,程序员有时候忘掉自己分配的内存释放掉,导致程序内存泄露,所以我在这里给大家介绍一个比较实用的小技巧,管理自己分配的内存 ,请看如下代码:/ 定义一个全局变量 做为计数static int g_num=0;/我封装的 分配内存函数void* createMalloc(int size)/分配内存void* p=malloc(size); / 分配内存成功 if(p) / 分配一次累计一次 +g_num; return p; return NULL;/ 我封装的 释放内存空间int delMalloc(void* delfree)/ 释放空间不为空 if(delfree) free(delfree); / 分配累计次数减1 -g_num; return 1; return 0; 各种区的存放方式:最小的是 代码区, 接着是只读区, 再上是全局区,然后是BSS段。堆区和栈区独立。堆区地址从小到大分配内存,栈区地址从大到小分配。察看内存分配的方法:/proc 就是所有进程 对应的目录,每个进程都对应一个自己进程的ID为目录名的目录。进程结束,目录消失。每个进程在自己的进程目录中都有 maps文件,就是存储的内存的信息cat /proc/进程ID/maps 可以察看进程的内存信息。察看进程ID,用ps -aux, 找到./a.out对应的ID。 进程中,可以用getpid() 取得进程ID。程序员接触到的都不是真实的物理内存地址,而是一个虚拟内存地址。每个进程都有04G的虚拟内存地址,但不映射 任何物理内存(32位系统)。虚拟内存地址在 映射 物理内存或文件之前,是不能存储东西的。虚拟内存地址只有映射了物理内存或文件,才能存储和使用,否则就是 段错误/总线错误。所谓内存分配 其实就是 虚拟地址和物理内存地址之间的映射。进程之间的内存都是独立的。内存释放就是切断映射。 一般情况下,03G是给用户用的,叫用户空间,3G4G是给内核使用的,叫内核空间。1G 近似是10亿。栈区地址0xbf开头是3G。堆区0x09开头内存地址的基本单位是字节,内存的分配和回收的基本单位是:内存页,每个内存页4096字节(4K)十六进制表示0x1000。用户空间不能直接访问内核空间,反之则可以,用户空间如果访问内核空间需要Unix系统函数段错误的成因:1、使用了没有映射物理内存的虚拟地址(如:野指针)。2、对只读区进行修改(没有权限)。strcpy 改值。/修改const的值。不建议使用const int ci = 100;/栈区int* p = &ci;*p = 200;printf(p = %dn, ci);malloc 不只是分配内存,还要记录内存分配的相关信息。因此,malloc(4)不只是4个字节。malloc 底层 用双向链表 记录信息。若改动相关信息,free可能报错malloc最申请一块大的内存。malloc 最小分配 33 个内存页。超过31个内存页的申请会按照 大内存申请方式分配:比申请多一点,不是33的整数倍虽然malloc()参数值不影响 内存映射 的大小(参数小于31内存页),但使用时,需要多少还是申请多少,原因:1、申请少,使用多,有可能影响free2、申请少,使用多,有可能被其他变量覆盖。栈区至少1个内存页,堆区至少33个内存页。malloc 分配内存,若 31页,只要内存总和 = 33 个内存,不会重新分配,若超过,会重新分配。free 并不保证真正释放内存,并且最后33个内存页也不能通过free释放,只能等待进程结束释放。_2013 - 7 - 6getpagesize() 可以取得内存页的大小。 unistd.h Unix的库文件。#include int getpagesize(void);int size = getpagesize();/取得内存页大小进程之间的虚拟内存地址和物理内存都是独立的。brk/sbrk 不是标准C函数,而是Unix的系统函数。sbrk :#include int brk(void *addr);void *sbrk(intptr_t increment);/参数为增量,数字increment为正,分配内存,返回初始位置;为负,释放内存,返回初始位置,无意义;为0,取当前位置。例如:初始位置是5,则sbrk(4),移动到新位置9,返回旧位置5,则分配了地址58共4个字节。再sbrk(-4),初始位置是9,新位置是5,则释放58共4个字节。sbrk/brk 内存的分配和回收 以一个内存页做基本单位,而malloc是33个内存页。sbrk/brk 与malloc不同,前者分配/回收 会马上完成。sbrk 分配好用,回收麻烦,要计算。brk 分配内存麻烦,但释放内存好用。#include int brk(void *addr);/参数:地址void *sbrk(intptr_t increment);brk不能取得当前地址,要用sbrk.mmap/munmap:mmap可以把 虚拟内存地址 映射到 物理内存/硬盘文件(默认时)。#include void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);/返回首地址,参数:1、指定首地址,通常是NULL或0,内核管理;2、内存大小,不足,则按一个内存页;3、指定访问权限,一般是PROT_READ|PROT_WRITE;权限:PROT_EXEC Pages may be executed./执行 PROT_READ Pages may be read./读 PROT_WRITE Pages may be written./写 PROT_NONE Pages may not be accessed./无权限 多权限用位或 | 连接。4、标识;MAP_SHARED 共享 MAP_PRIVATE 独有,映射物理内存用。 MAP_ANONYMOUS 映射物理内存。5、文件描述符,代表映射文件(0);6、映射文件位置,(从文件头开始的偏移量)(0)。失败返回 -1,而不是NULL.int munmap(void *addr, size_t length);一般,程序员写的程序运行在用户空间,但某些时候需要使用 内核空间,Unix/Linux提供了一系列函数 实现。这些函数统称系统调用(System Call)。但是用户空间通过系统调用进入内核空间的开销很大,首先 封存用户空间的所有数据和状态,转而进入内核空间,内核空间执行完毕,再把分寸的数据和状态取回。文件和目录在Linux系统中,几乎一切都被看成文件。包括硬件设备。/dev/tty /标准输入和标准输出(键盘和显示器)cat /dev/tty 从键盘读入ls /dev/tty 输出到显示器/dev/null 空cat /dev/null a.txt 清空a.txtopen 打开文件read 读文件write 写文件close 关闭ioctl 输入输出控制 #include #include #include int open(const char *pathname, int flags);/参数:文件名, flag权限:O_RDONLY 只读, O_WRONLY 只写, or O_RDWR 读写O_CREAT创建/打开,可以和下面两个做辅助:O_EXCL如果文件已经存在,返回失败。O_TRUNC清空已经存在的文件。O_APPEND追加方式。可用 | 连接多个。第三个参数在O_CREAT新建文件时需要指定,8进制文件权限返回文件描述符,失败返回-1. int open(const char *pathname, int flags, mode_t mode); int creat(const char *pathname, mode_t mode);文件描述符:Unix/Linux 打开文件时,把相关信息存入 文件表中。每个文件表 用 int 做编号来代表,一个文件表可以有多个编号,这个 编号 就是 文件描述符。系统会维护一个 文件表和文件描述符 对应关系的表格。因此,文件描述符本质是一个整数,但这个整数是文件的代言。文件描述符 是非负整数,因此 -1 代表错误。0 1 2 默认被系统占用,代表标准输入和标准输出和标准错误。文件描述符 从3 开始,到 OPEN_MAX (同时打开的最大值)open函数 返回一个新的文件描述符,新的文件描述符应该是 未使用的描述符的最小值。#include ssize_t read(int fd, void *buf, size_t count);/read/write 用法相近,和fread/write类似1、fd2、读写首地址3、读到的buf的大小_2013 - 7 - 8底层用UC函数,应用层用标准C函数。API 应用程序接口。若无要求,用标C。time ./a.out /察看可执行程序的运行时间标C花费时间real短,UC花费时间real多。标C 文件相关函数(IO函数)都定义了缓冲区,数据累计到一定程度以后才读写一次,因此提升了效率。UC的系统函数在用户层没有缓冲区,数据不累计直接读写,效率较低。进内核 低效。UC 的系统函数可以自己定义自己的缓冲区, 来大幅度提高效率。lseek 成功返回 偏移量, 失败返回 -1.偏移量和文件表挂钩,故打开两次一个文件,产生两个偏移量。文件表在内存,故偏移量也在内存。v节点指针在文件表中,指向v节点表v节点表保存文件在硬盘上的信息。ls -i回车 显示 i 节点信息open 打开文件步骤:进程表 文件表 v节点表文件描述符的复制 函数 dup/dup2dup返回的文件描述符的值是 计算机指定的(未使用的最小值)。dup2 可以用第二个参数去指定文件描述符的值,若此值已经被使用,dup2会先强行关闭这个正在使用的文件描述符,然后用这个值进行复制。dup的返回值不确定,而dup2的返回值可以确定(第二参)。#include int dup(int oldfd);/参数:复制品。失败返回 -1.int dup2(int oldfd, int newfd); #define _GNU_SOURCE #include int dup3(int oldfd, int newfd, int flags);dup/dup2 不会复制文件表两个描述符,可以有一个文件表。sync, fsync, fdatasync fcntl.h 功能很强file control的缩写int fcntl(int fd, int cmd, . /* arg */ );/参数:1、文件描述符;2、命令;3、目标文件描述符。cmd 有很多:1、F_DUPDF 复制文件描述符,有第三个参数,代表新的文件描述符,若这个值被使用,返回比这个值稍大的最小值。例如:fcntl(fd,F_DUPFD,newfd);2、F_GETFL(void) 取得/设置访问权限和状态标记(O_APPEND),取不到创建标记。3、F_SETFL(long) 访问权限 和 创建标记不可改,只能设置状态标识。可以上文件锁O_WRONLY / 1O_RDONLY / 0O_RDWR / 2O_CREAT / 64O_APPEND / 1024若两个进程同时 写一个文件,则互相覆盖,最终文件内容 杂乱。用文件锁解决。就是一个进程在写,锁定其他进程,等当前进程写完了其他进程再写。早期,互斥锁,是读写都锁。现在,读写锁,一个读锁,一个写锁。读锁 是针对写的锁定,对读不锁定。写锁,是针对所有的锁定,无论读写都锁定。fcntl 加锁:F_GETLK, F_SETLK and F_SETLKW延时。锁的内容struct flock . short l_type; /* Type of lock: F_RDLCK, F_WRLCK, F_UNLCK */ 锁的类型:读锁写锁释放锁 short l_whence; /* How to interpret l_start:SEEK_SET, SEEK_CUR, SEEK_END */锁定的开始位置参照,和lseek一样 off_t l_start; /* Starting offset for lock */偏移量 从开始位置参照点偏移多少 off_t l_len; /* Number of bytes to lock */锁定长度 pid_t l_pid; /* PID of process blocking our lock(F_GETLK only) */锁定进程号不用 传入 -1. .;l_whence和l_start联合决定了从哪里开始锁.加什么锁,要和open函数一致_-2013 - 7 - 9文件锁并不会真正锁定文件,因此对write/read没有锁定效果。文件锁的用法:锁定对文件的加锁行为。文件锁的正确用法: 保证每次读操作(read)之前都要加上读锁,每次写操作之前都要加上写锁,利用 能否上锁 决定读写函数是否被调用。 1 #include 2 #include 3 #include 4 #include 5 6 int main() 7 8 int fd = open(a.txt, O_RDWR|O_TRUNC|O_CREAT); 9 if(fd = -1) perror(open),exit(-1); 10 struct flock lock; 11 lock.l_type = F_WRLCK; 12 lock.l_whence = SEEK_SET; 13 lock.l_start = 0; 14 lock.l_len = 10; 15 lock.l_pid = -1; 16 int res = fcntl(fd,F_SETLK,&lock);/ 17 if(res = -1) perror(fcntl),exit(-1); 18 else 19 20 sleep(20); 21 write(fd, abcde, 5); 22 lock.l_type = F_UNLCK; /设置锁的类型 fcntl(fd, F_SETLK, &lock);/释放锁 23 close(fd); 24 释放锁就是把锁的类型改成F_UNLCK,在fcntl重新set一次就释放了。涉及到多进程的文件读写操作:1、open得到fd2、对fd上锁,如果读文件 上读锁,写文件 上写锁3、调用read/write函数进行读写4、把锁的类型改成F_UNLCK,然后fcntl释放锁5、close(fd)(不一定马上做)注意:fcntl 第三个参数的类型。F_SETLK 若加不上锁,立刻返回 -1 ,非阻塞。F_SETLKW 若加不上锁,会等待,等到能加上锁为止。F_GETLK 不是取得一把锁,是测试一个锁能不能加上。无论锁能不能加上,都不会加锁。若可以加,lock中的类型变成F_UNLCK,其他不变。若不可以加,把正在锁定的锁保存到lock中,完全覆盖原来的锁,包括l_pid.通常用l_pid的值是否 -1 判断能否加上, 是 -1 能加,否则不能加。0 F_RDLCK, 1 F_WRLCK, 2 F_UNLCKstat, fstat, lstat stat 函数可以取得 文件的各种状态(类似 ls -l的功能)#include #include #include int stat(const char *path, struct stat *buf);/不需要打开文件前一个是 文件名,后一个是往外带出值int fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat *buf);struct stat dev_t st_dev; / ino_t st_ino; /i节点mode_t st_mode;/权限+文件类型nlink_t st_nlink;/硬链接数uid_t st_uid;/属主gid_t st_gid; /属组dev_t st_rdev; off_t st_size; /文件大小blksize_t st_blksize; blkcnt_t st_blocks; time_t st_atime; /time_t st_mtime; /最后修改时间time_t st_ctime; /状态改变时间 S_ISREG(m) /是不是普通文件 S_ISDIR(m) /是不是目录实例:#include #include #include #include int main() struct stat s = ; int res = stat(a.txt, &s); if(res = -1) perror(stat), exit(-1); printf(inode = %dn, s.st_ino); printf(mode = %on, s.st_mode); printf(权限: %on, s.st_mode & 07777); printf(硬链接数:%dn, s.st_nlink); printf(size = %dn, s.st_size); printf(最后修改时间:%sn, ctime(&s.st_mtime); if(S_ISREG(s.st_mode) printf(文件n); else if(S_ISDIR(s.st_mode) printf(目录n); return 0;access 函数 判断权限(读写执行)和文件是否存在。access(a.txt, R_OK) = 0 /可读access(a.txt, W_OK) = 0 /可写access(a.txt, X_OK) = 0 /可执行access(a.txt, F_OK) = 0 /文件存在#include int access(const char *pathname, int mode);umask :为进程设置文件模式创建屏蔽字,并返回以前的值。参数是由9个常量(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)中的若干按位或构成的。#include #include mode_t umask(mode_t mask); /参数:屏蔽什么写什么,注意是八进制的。传入新的,返回旧的。chmod/fchmod 可以一个文件的权限,以八进制形式。truncate/ftruncate 可以指定文件的大小。#include #include int main()chmod(a.txt, 0666);/改变a.txt权限struct stat s = ;stat (a.txt, &s);/把a.txt状态存入 s 结构体printf(mode = %on, s.st_mode & 0777);printf(size = %dn, s.st_size);truncate(a.txt, 100);/指定文件大小指令 chmod 777 abc /文件abc变成全权限mmap.munmap 映射文件MAP_PRIVATE /不会真正写入文件,要用MAP_SHAREDmkdir() /创建空目录 常用rmdir() /删除空目录chdir() /切换目录(cd) 常用getcwd() /获取当前目录(pwd)察看目录下的内存:1、opendir 返回DIR*2、readdir(DIR*) 返回struct dirent*readdir把当前子目录/子文件的信息存入结构,同时位置移动到下一位。因此,循环读 就可以读出所有,遇到NULL退出目录4, 文件8读目录#include #include #include int main() DIR* dir = opendir(./); if(dir = NULL) perror(opendir),exit(-1); struct dirent * ent = readdir(dir);/读第一个子项 while(ent)/以NULL结束 printf(%d, %sn, ent-d_type, ent-d_name); ent = readdir(dir);/读下一个子项 return 0;_2013 - 7 - 10进程察看进程 pskill 结束进程 一般用 -9 结束进程ps -ef Unix通用,显示详细的进程信息ps -aux Linux专用,很多Unix不直接支持系统用一个进程ID(PID)管理进程。进程ID在同一时刻唯一,但可以 延时重用。Unix/Linux系统 在启动时,需要启动多个进程,顺序固定。启动其他进程的进程叫父进程PPID,被启动的进程叫子进程。vi 在哪里? whereis vi回车。远程登陆:telnet 0 (20可以改为23,26)用户名:openlab ,密码:open123S 休眠状态O 可运行状态R 运行状态T 挂起状态Z 僵死状态(僵尸进程)父进程负责启动子进程,然后同时运行。子进程结束,发给父进程信号,父进程收回子进程的资源。若父进程先结束,子进程变成孤儿进程,把init进程(进程1)作为心的父进程,孤儿进程由init进程负责收回。若子进程发送结束信号给父进程,出了问题,子进程变成僵尸进程。关于PID函数:getpid() 取得当前进程的IDgetppid() 取得父进程的IDgetuid() 取得实际用户的IDgeteuid() 取得有效用户的IDgetgid() 取得用户组的ID注:getuid() 目前返回也是 有效用户的ID。如何创建新的进程?fork()/vfork() 创建新的进程fork():通过复制当前进程,去创建 子进程,复制的是 全局区、BSS区、堆区、栈区,但不复制代码区,父子进程将分别执行 相同的代码区。fork() 之前的代码,只有父进程执行,之后的代码父子进程会分别执行,执行两次。#include pid_t fork(void);/返回整型。 #include #include int main() printf(beginn); pid_t pid = fork(); printf(pid = %dn, pid); return 0;结果:beginpid = 3599pid = 0父进程返回子进程的ID ,即3599.if(父进程)return 子进程的ID;elsereturn 0;/取得父子进程的id 1 #include 2 #include 4 int main() 5 6 pid_t pid = fork(); 7 if(pid = 0) 8 printf(我是子进程%d,我的父进程%dn, getpid(), getppid(); 9 else if(pid 0) 10 printf(我是父进程%d, 我的子进程%dn, getpid(), pid); 11 return 0; 12 fork() 之后,父子进程同时运行,把能确保那个进程先运行,不同的操作系统各不相同。ubuntu-12.04(达内)父进程先运行。 vfork() 可以,保证子进程先运行。文件表不复制,只复制描述符。fork() 前复制,之后分别申请内存。一个进程的结束分为正常结束和非正常结束。正常结束包括:主函数return/exit()/_exit() _Exit()/最后一个线程结束非正常结束:遇到信号: 比如2信号 9信号 用about()函数结束(借助信号)最后一个线程被取消。exit() /完全退出整个进程。exit()/_exit()/_Exit() 区别:#include /UC函数 底层 void _exit(int status); #include /标C函数 应用层 void _
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络教育机构管理办法
- 网络贷款平台管理办法
- 网络预约车辆管理办法
- 美容美体管理办法标准
- 老年餐厅服务管理办法
- 职业卫生场所管理办法
- 职工食堂费用管理办法
- 职高老师管理办法细则
- 船厂工装材料管理办法
- 船舶修造安全管理办法
- DB65-T 4773-2024 生物安全实验室消毒技术指南
- 2024年新北师大版七年级上册数学全册课件(新版教材)
- 成人体外膜氧合辅助期间感染防控专家共识2024版
- 2024年河北石家庄市井陉矿区人力资源和社会保障局公益性岗位招聘100人历年(高频重点提升专题训练)共500题附带答案详解
- 抖音火花合同电子版获取教程
- 优化方案语文必修上册
- 云南省大中型水电站情况表
- HYT 0318-2021 填海项目竣工海域使用验收测量规范
- 旅游景区规划设计方案
- 高中历史知识竞赛省公开课一等奖全国示范课微课金奖课件
- DL-T 5117-2021水下不分散混凝土试验规程-PDF解密
评论
0/150
提交评论