这几天看了一点进程的知识,也会创建一个或几个子进程了,在这里,我很想和大家分享一下,在创建子进程的时候,我们现在所说的写时拷贝技术。 我们知道,在我们fork一个进程之后,系统就会给我们创建一个子进程,此时,子进程会继承父进程几乎所有的资源,并且系统会给子进程分配一个新的物理空间,但实际上,子进程和父进程是用的同一个代码段的,在fork之后子进程只是复制了父进程的数据段,堆栈段,但即使这样,也还是会浪费系统的资源空间,之后,fork做了这样的改变,父进程在fork完之后,子进程只是有了自己的独立虚拟空间,它的物理空间其实是和父进程共享的,当系统检测到父进程和子进程的相应段发生变化的时候,也就是有写的操作的时候,系统才给子进程分配相应的物理空间。 我们也许会问,为什么有写时拷贝这样的技术,这样做的用处是什么,你可以想想,当我们fork一个程序之后,如果立马使用了exec函数族,那么如果还像以前那样,fork完之后就复制父进程的资源给子进程,但是子进程根本用不到这些代码和数据,那么系统的资源就会被浪费,unix和unix(like)是非常讲究效率的操作 继续阅读 >>


董恒毅 16/08/01 21:00:55
等待进程结束 当子进程先于父进程退出时,如果父进程没有调用wait和waitpid函数,子进程就会进入僵尸状态 #include<sys/types.h> #include<sys/wait.h> pid_t wait(int *statloc) pid_t waitpid(pid_t pid, int *statloc, int options) //wait函数的返回值是终止运行的子进程的pid,参数statloc存放的是子进程的退出码,状态信息将被写入statloc所指向的变量 //wait函数也会来等待子进程的结束,但它用于等待某个特定的子进程的pid,statloc和wait的含义相同,option如果被设置为WNOHANG,则父进程不被挂起而立即执行后面的代码 如果想让父进程周期性的检查某个特定子进程是否退出,可以写如下代码: waitpid(child pid, (int *)0, WNOHANG) 如果子进程未退出则返回0,子进程已经结束,返回childpid,失败返回-1 进程的其他操作 继续阅读 >>


董恒毅 16/08/01 17:41:39
进程退出 在Linux下系统进程退出的方法分为正常退出和异常退出两种 正常退出: 在main函数中执行return 调用exit函数 调用_exit函数 异常退出: 调用abort函数 进程收到某个信号,而该信号使程序终止 补充: exit和return的区别:exit是将控制权交给系统,return将控制权交给函数 exit和abort的区别:exit是正常终止,abort是异常终止 exit(int exit_code):exit中的参数为0代表正常终止,若为其他值表示异常终止 exit和_exit的区别:exit在stdlib.h中声明,而_exit在unistd.h中声明,exit要先执行一些清除操作,然后将控制权交给内核,而_exit会执行后立即返回给内核 僵尸进程: 当父进程先于子进程退出,子进程会变成孤儿进程而被init收养,当子进程先于父进程退出,父进程还没有调用wait函数等待的话,子进程就会变成僵尸进 继续阅读 >>


董恒毅 16/07/30 16:02:48
进程操作 1. 创建进程: 系统创建:由它创建的进程是平等的,一般不会存在资源继承的关系,在系统启动时,操作系统会创建一些进程,他们承担着管理和分配系统资源的任务,这些进程也被称为系统进程。 父进程创建:子进程和父进程属于隶属关系,子进程也可以继续创建子进程,这样就会形成一个进程家族。子进程会继承父进程几乎所有的系统资源。接下来讲的都是父进程创建子进程。 2.fork函数: #include<sys/types.h> #include<unistd.h> int fork() //fork函数非常特殊,它有两个返回值。当fork调用后,当前进程实际上就已经分裂成两个进程,一个是父进程,一个是刚刚创建的子进程,fork函数的两个返回值分别是父进程调用fork函数返回子进程的进程id,一个是子进程调用fork函数返回0,一般会在程序中用这两个返回值来判断当前是哪个进程在执行这个程序。 //进程创建失败会返回-1。 补充: fork函数之后到底是子进程先运行,还是父进程先运行这是不确定的,它 继续阅读 >>


董恒毅 16/07/30 10:27:41
linux进程: 今天准备开始总结linux进程的相关知识,我会从进程的概念入手,给大家总结完进程结构,进程的内存映像,如何创建进程,退出进程,在进程中执行新程序,以及如何获取进程ID,改变进程优先级等等 进程概念: //首先,我们知道,一个电脑能正常运行,除了电源和必备的硬件之外,最重要的就属操作系统了,操作系统是用来管理计算机的软,硬件资源,使一台计算机能真正的运行起来,而现代的操作系统的主要特点就在于程序的并行执行(简单说就是多个逻辑上独立的程序或程序段可以同时进行),然后就需要借助进程这个东西了。 //进程是管理系统资源的最小单位,linux可以同时启动多个进程。 //进程是程序执行的一次过程,进程和程序,线程都是不一样的,进程是动态的,程序是静态的,进程是运中的程序,程序是保存在硬盘上的可执行代码。 进程标识: 每个进程都是通过唯一的进程id进行标识的,它是一个非负整数,每个进程还有一些其他的标识,这些都可以用函数来获得。 int getpid(): 获得进程id int getppid(): 获得父 继续阅读 >>


董恒毅 16/07/29 11:53:17
目录操作 1.目录的创建和删除 mkdir函数可以进行目录的创建 #include<sys/types.h> #include<sys/stat.h> int mkdir(const char * pathname, int mode) //新创建的目录所有者的uid和创建这个目录进程的uid是一样的,也就是说,如果父目录设置了st_gid位,则新创建的目录也具有st_gid位(设置该位后任何在此目录下创建的文件的组id和该目录的组id是一样的) //函数调用成功返回0,失败返回-1 rmdir函数可以进行目录的删除 #include<unistd.h> int rmdir(const char * pathname) //只能删除空目录 //函数调用成功返回0,失败返回-1 2.获取当前目录 getcwd函数可以获取进程当前的工作目录 #include<unistd.h> char * getcwd(char * buf, 继续阅读 >>


董恒毅 16/07/27 08:14:37
1.文件属性操作 每个用户有一个对应的uid,当uid为0的时候,此用户具有root权限 2.获取文件属性 stat,fstat,lstat获取文件属性 #include<stat.h> #include<sys/types.h> #include<unistd.h> int stat(const char * filename, struct stat * buf) int fstat(int fd, struct stat * buf) int lstat(const char * filename, struct stat * buf) //函数执行成功返回0,失败返回-1 参数const char * filename是要获取的文件名,stat保获到的文件的信息,fstat是文件描述符来获取指定的文件名的,lstat是获取符号链接类文件的状态信息,它不像stat那样是获取的链接文件所指向的文件的信息,而是获得链接文件本身的状态信息。 struct stat { 继续阅读 >>


董恒毅 16/07/26 17:54:32
今天在讲linux下文件的加锁之前,我要先说一说文件为什么要加锁,因为我相信很多人对文件的锁机制都是很迷惑的。 文件为什么要加锁 因为linux是一个多进用户多任务的操作系统,假如我们对一个文件进行写操作的时候,我们开了好几个进程对这个文件同时进行写操作,这时可能就会发生文件数据的不同步,而且像一些文件,比如数据库,我们必须保证每次进程只能单独的对这个文件进行写操作,为了提供这种机制,linux提供了记录锁机制。 文件的锁的种类 读锁 如果给一个文件上了读锁,那么这个文件是其他进程只能读不能写的,多个进程在一个字节上是可以有一把共享的读锁的,也就是说,一个文件是可以加多把的读锁 写锁 如果给一个文件上了写锁,那么同时其他的进程无法读也无法写的,一个字节上只能有一把写锁,不能再加任何其他的锁,这是由于写锁的独占性,但是一个文件可以被分为多个不同的区域,锁机制只能在自己的区域内起作用,也就是说如果把一个文件分为A,B两个部分,那么也是可以加两个写锁或一个写锁一个读锁的 锁的不兼容性 如果一个文件的某一区 继续阅读 >>


董恒毅 16/07/25 22:16:30
1.文件的创建,打开和关闭 open系统调用用来打开或创建一个文件。 #include<sys/types.h> #include<sys/stat.h> #include<fcnlt.h> open("filename[N]", int flag) open("filename[N]", int flag, mode_t mode) //文件打开成功返回文件描述符fd,打开失败返回-1 第二个参数(文件的打开方式)的宏如下: - O_RDONLY:只读打开; - O_WRONLY:只写打开; - O_RDWR:可读可写; - O_CREAT:若文件不存在则自动创建,当第二个参数里含有这个宏的时候才会使用第三个参数,也就是给创建的文件附上权限,和之前的chmod函数里面的mode是一样的。 - O_EXCL:如果O_CREAT被设置,此参数也被设置的话,它会检查要创建的文件是否存在,如果不存在的话则创建,存在的话则导致文件打开出错。 - O_TRUNC:如果 继续阅读 >>


董恒毅 16/07/25 20:26:19
系统编程: 系统编程是指程序员使用系统调用或c语言本身所携带的库函数来设计和编写具有某一特定功能的程序。 linux的文件系统 linux重要的一个概念就是linux下一切皆文件,从根目录开始,逐渐形成了目录树结构 : /:最上一级的目录,所有目录都被根目录所包含。 /bin:linux系统下存放的普通用户可以执行的目录,也是所有用户都可以执行的普通命令。 /boot:linux系统的内核及启动系统时所需要的文件,因为比较重要,所以一般放在独立的分区上。 /dev:设备文件的目录。 /etc:系统的配置文件,比如用户帐号和密码。 /home:家目录。 /lib:用户存放各种库文件。 /proc:虚拟文件系统,用作内存与磁盘的交换区。 /root:超级用户,拥有整个系统最高的权限。 /sbin:存放的是用于管理系统的命令。 /tmp:临时文件目录。 /usr:存放系统应用程序及其相关文件。 /var:系统中经常变化 继续阅读 >>


董恒毅 16/07/23 21:22:32