关于unix 系统调用fork()小结
上周自习的时间我看了看一些,系统调用的博客。正好《深入理解计算机》这本书也看到了这一部分,就写一点简单的个人体会。
首先是fork函数,它是一个unix系统提供的系统接口,还有关于系统调用的补充,系统调用是通过异常(陷阱)来触发进入内核模式的,由于是在windows环境下不会调用win的系统调用,也就留着下次再linux上上代码了,但这篇随笔主要在于总结,而不是侧重于讲解函数。它的头文件是#include<unistd.h> ,作用是创建一个子进程,并且会复制出父进程的用户级的虚拟进程空间的副本,成功就会返回子进程的“pid_t”数据类型的变量 , 本质是一个int。失败返回-1,还有一个非常重要的就是在子进程哪里pid == 0 ,子进程创建后会和父进程并发执行如果不使用wait()函数就会让子进程变成僵尸进程,使用ps -ax z状态的就是僵尸进程,这里成为僵尸进程的主要原因是因为父进程先退出如代码:(解决方法就是用wait函数,缺时间就不补了)
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<errno.h> 4 #include<sys/types.h> 5 int main(void) 6 { 7 pid_t pid =-1; 8 if( (pid = fork()) < 0){ 9 printf("fork error : %s", strerror()); //这这博客的插入代码简直受罪 10 exit(0); 11 } 12 else if(pid == 0 ){
printf("child!\n");
sleep(5); 13 exit(); 14 } 15 printf("the end!"); 16 exit(0); 17 }
由于是多进程操作系统,子进程父进程是并行的,父进程很有可能会提前退出。自然这份代码没有使用wait函数来回收子进程也会造成很多麻烦,但是他们的输出都会在同一个输出流,这是因为子进程会继承父进程的所有打开文件。先到这里,看书了(水平不够心中所想都不能正常表达)……有空再补