进程创建

主函数的参数

1
2
3
4
int main(int argc,char *argv[],char *envp[])
argv:(char*)[] 传递给main方法的参数列表
argc:int 传递给main方法的参数列表的个数
envp:(char*)[]传递的环境变量列表

只要用户执行程序,main方法默认至少接收一个参数,此参数就是执行程序的命令。

尝试传递参数hello world

输出缓冲区

对于这个代码,结果是先睡眠5秒钟,然后打印hello world

原因:首先将hello写入输出缓冲区,再去执行sleep,然后再将 world\n写入输出缓冲区。

输出缓冲区中的内容刷新到界面上的条件

  • “\n”
  • 手动刷新 fflush(stdout)
  • 缓冲区满
  • 进程结束 _exit(不管缓冲区有没有数据直接结束程序) exit

进程创建-fork()方法

通过一个进程创建一个进程—>程序

1
2
3
4
fork()方法
pid_t fork(void);
pid_t getpid(); --->获取当前进程的PID
pid_t getppid();--->返回当前进程的父进程的PID

在父进程中返回子进程的pid,在子进程中返回0,失败返回-1

fork()方法调用后,父子进程都从fork()调用之后的指令开始执行。

虽然用户启动了这个程序,在fork之后,复制了一个子进程,子进程返回的是一个0,而父进程返回的是非0值,所以结果是这样。

fork之后,父子进程是并发执行的,先执行谁是有操作系统决定。

子进程修改全局数据不会影响父进程数据的值。

  • malloc申请空间并不是malloc成功后就将物理内存空间分配给用户,而是在用户使用的时候才会给用户分配物理内存空间,malloc调用成功只是将虚拟地址空间上的堆区空间分配给用户。
  • fork方法并不会直接将父进程的数据空间复制给子进程,而是子进程在修改数据空间上的数据时,才会给子进程分配空间。
  • 释放空间时,会直接将物理内存空间释放。

写时拷贝技术