TCP/IP,Linux下多进程编程,进程复制函数fork,双返回值函数,通过父进程复制一份代码相同的子进程,父子进程执行顺序由调度算法决定,代码中获取进程执行用户的函数,数据共享状态

TCP/IP,Linux下多进程编程,进程复制函数fork,双返回值函数,通过父进程复制一份代码相同的子进程,父子进程执行顺序由调度算法决定,代码中获取进程执行用户的函数,数据共享状态

一、Linux多进程编程:
1、Linux多进程编程中,一个进程产生另一个进程,需要使用fork函数,fork函数可以在代码中复制一个子进程,
2、fork()以后的代码被父子进程执行,fork()以前的代码只被父进程执行,
3、使用man fork查看fork的头文件以及声明。

二、fork双返回值使用方法:
1、返回值有两个,分别是子进程的pid和0,在当前进程(父进程)中会返回创建的子进程的pid,在创建的子进程中会返回0,将返回值与0进行比较可以区分子进程和父进程,并执行不同的操作。
2、创建失败时则会返回-1
3、Linux下的所有进程都是由父进程bash一一fork出来的。

三、验证函数:
1、getpid()获取当前进程的pid
2、getppid()获取当前进程的父进程的pid
注意,当子进程获取父进程的pid时,如果父进程已经运行完毕,获得的父进程的pid就是1(bash进程)或者其他值,否则就是父进程的pid。

TCP/IP,Linux下多进程编程,进程复制函数fork,双返回值函数,通过父进程复制一份代码相同的子进程,父子进程执行顺序由调度算法决定,代码中获取进程执行用户的函数,数据共享状态_第1张图片

四、循环创建进程:
1、如果在for或者while循环中fork新的进程,创建出来的进程数量将是2^n - 1,类似于兔子生孩子的情况,为了避免创建出一大堆进程,每次创建出来的进程都需要及时break。
2、创建完毕后可以通过计数器i与n比较区分父进程和子进程。

TCP/IP,Linux下多进程编程,进程复制函数fork,双返回值函数,通过父进程复制一份代码相同的子进程,父子进程执行顺序由调度算法决定,代码中获取进程执行用户的函数,数据共享状态_第2张图片

五、父子进程的执行顺序:
父进程创建出子进程后,会共同抢占CPU资源,结果随机,如果想要控制两者的运行顺序,需要使用sleep使某个进程睡眠指定时间,或者阻塞,已达到控制运行顺序的效果,内核使用的调度算法决定进程的执行先后。

六、通过代码获取当前运行时用户:
uid_t getuid得到实际用户id,例如sudo命令下,会得到实际的用户uid,而不是root
uid_t geteuid得到有效id,sudo命令下,得到root的id,主要是区分su,sudo提权获取的用户。

七、进程数据共享状态:
1、父子进程拥有相同的代码,但子进程只会执行fork自己往后的代码。
2、父子相同处:
全局变量,.data,.text,堆栈,环境变量,用户ID,进程工作目录,信号处理方式
3、父子不同处:
进程ID,fork返回值,父进程id,进程运行时间,闹钟(定时器),未决信号集。
4、父子进程之间,读共享,写复制,子进程中没有写操作的数据,是共享的物理地址,子进程中发生了写操作的数据,是复制了内容的独立物理地址。
5、父子进程共享的数据:文件描述符(打开文件的结构体),mmap建立的映射区(用于进程间通信)。
6、0-4G的虚拟地址中,0-3G是一样的,3-4G的进程有关信息是不一样的。

你可能感兴趣的:(TCP/IP,Linux,tcp/ip,linux)