创建一个进程:
/******************** *功能:创建一个新进程,通过复制当前进程(和父进程一样),执行的位置都一样 *pid_t:一般是16位的有符号的整型数,不够可以typedef * 返回值:非0 :“在父进程中”--->返回子进程编号 * 0 :”在子进程中“--->返回0 * -1 :失败,并设置errno * ****************/ pid_t fork(void);
父子进程区别:fork的返回值不一样
pid不同
ppid不同
未决信号(未响应的信号)和文件锁不继承
资源利用量归0
init进程:是所有进程的祖先进程---1号进程
eg:简单创建一个子进程
/************************ *创建一个子进程 ***********************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid ; printf("[%d]:begin\n",getpid()); //0.在fork前一定要刷新之前打开的流 fflush(NULL); //1.创建进程 pid = fork(); if( pid < 0 ) { perror("fork()"); exit(1); } //2.子进程 if(pid == 0) { printf("[%d]:child is working\n",getpid()); } else { printf("[%d]:parent is working\n",getpid()); } printf("[%d]:end\n",getpid()); exit(0); }
不加fflus有两种结果
结果1:
[root]# ./forkbase
[3862]:begin
[3862]:parent is working
[3862]:end
[3863]:child is working
[3863]:end
结果2:
[root]# ./forkbase > /tmp/out
[root]# cat /tmp/out
[3997]:begin
[3997]:parent is working
[3997]:end
[3997]:begin
[3998]:child is working
[3998]:end
*[root]# ./forkbase 输出到终端(行缓冲,加了\n刷新了缓冲区,所以begin打印了一次)
*[root]# ./forkbase > /tmp/out 重定向到一个文件,文件是全缓冲模式(\n只是换行),由于子进程继承父进程的一切,那么缓冲区就有两个begin,所以begin就会被打印2次,)
*:调度器的调度策略来决定哪个进程先运行
获取pid号:
#include <sys/types.h> #include <unistd.h> /********获取当前进程pid号*********/ pid_t getpid(void); /********获取当前进程的父进程pid号*********/ pid_t getppid(void);
=======================================================================
man ps
命令ps:输出进程的一些信息
ps axf:打印进程的信息 PID TTY STAT TIME COMMAND
进程号 占据终端 状态 消耗时间 哪个命令触发的
ps axm:详细信息查看
ps ax -L :以linux特有的方式查看 LWP(轻量级进程)---线程
=======================================================================
进程号顺次向下使用