标签归档:fork

linux c 进程fork

linux c提供了一个进程操作函数fork,下文主要阐述fork的应用。
一 获取进程ID
在linux中每个进程都有一个进程ID号(非负的正整数),通过getpid函数可以返回进程的PID,getppid函数可以返回父进程的ID号。
调用函数getpid getppid需要引入相应的头文件
#include < unistd.h>
#include < sys/types.h>
pid_t getpid(void);
pid_t gettpid(void);
getpid gettpid函数返回一个类型为pid_t的整数值
fork获取进程id
从上面的示例程序可以看出,父进程ID和每次执行程序所产生的新的进程Id。
二 创建和终止进程
进程有三种状态:
运行:进程在cpu上执行,等待被执行
停止:进程运行时被挂起,不会被再次调度,信号(SIGSTOP SIGTSTP SIDTTIN SIGTTOU)会使进程停止,直到收到信号(SIGCONT)才会重新唤起进程,使进程再次运行。
终止:进程被永远停止;当进程收到停止信号 运行到终止进程的位置 调用exit函数。


在linux c中父进程通过使用fork函数创建子进程。
#include < unistd.h>
#include < sys/types.h>
pid_t fork(void); //子进程创建成功返回0 否则返回-1
新创建的子进程几乎同父进程相同,子进程通常会得到一份同父进程用户级虚拟地址空间相同的一份copy ,包括文本 数据 bss段 堆 用户栈。子进程还拥有同父进程一样的状态信息(例 父进程打开文件一份文件,此时创建一个子进程,那么子进程也可以直接访问文件);
新创建的子进程同父进程最大的区别在于 拥有不同的进程号(PID);
fork创建进程
从上面的示例我们可以看出
1 fork时候 copy了一份代码作为子进程运行,所以一次调用fork,却使代码运行了两遍;
2 从x的值的变化,我们可以看出程序拥有不同的存储空间;
3 子进程和父进程共享I/O文件;

三 fork扩展
#include < stdio.h>
#include < unistd.h>
#include < sys/types.h>
int main(){
int x=0;
fork();
fork();
printf(“this x is %d\n”,++x);
return 0;
}
多次fork
从上面的示例可以看出fork时嵌套执行,及 一次fork为 2次执行 二次fork为四次 三次fork 八次 4次fork则为 二的4次方次运行。