主函数的参数
1 | int main(int argc,char *argv[],char *envp[]) |
只要用户执行程序,main方法默认至少接收一个参数,此参数就是执行程序的命令。
尝试传递参数hello world
输出缓冲区
对于这个代码,结果是先睡眠5秒钟,然后打印hello world
原因:首先将hello写入输出缓冲区,再去执行sleep,然后再将 world\n写入输出缓冲区。
输出缓冲区中的内容刷新到界面上的条件
- “\n”
- 手动刷新 fflush(stdout)
- 缓冲区满
- 进程结束 _exit(不管缓冲区有没有数据直接结束程序) exit
进程创建-fork()方法
通过一个进程创建一个进程—>程序
1 | fork()方法 |
在父进程中返回子进程的pid,在子进程中返回0,失败返回-1
fork()方法调用后,父子进程都从fork()调用之后的指令开始执行。
虽然用户启动了这个程序,在fork之后,复制了一个子进程,子进程返回的是一个0,而父进程返回的是非0值,所以结果是这样。
fork之后,父子进程是并发执行的,先执行谁是有操作系统决定。
子进程修改全局数据不会影响父进程数据的值。
- malloc申请空间并不是malloc成功后就将物理内存空间分配给用户,而是在用户使用的时候才会给用户分配物理内存空间,malloc调用成功只是将虚拟地址空间上的堆区空间分配给用户。
- fork方法并不会直接将父进程的数据空间复制给子进程,而是子进程在修改数据空间上的数据时,才会给子进程分配空间。
- 释放空间时,会直接将物理内存空间释放。
写时拷贝技术