linux fork (学习)

进程是程序执行和资源管理的最小单位。

为什么需要进程呢?

计算机在最开始的确是没有进程这个概念的,但是随着硬件的发展cpu的运行速度越来越快了,如果只是单独一个进程的话,那么在程序准备数据的过程中cpu实际上是处于空闲状态的,为了让cpu的硬件资源得到充分的占用,所以就引发出了进程这种机制。(微观串行,宏观并行)

linux管理线程的方式是通过PCB的方式(process control block)是一个结构体

task_struct {
    PID,             //进程标识符
	PPID,            //父进程ID号  
	当前工作路径     //chdir
	umask            //0002
	进程打开的文件列表 //文件IO中有提到
	信号相关设置       //处理异步io, ---段错误
	用户id,组id
	进程资源的上限
}

进程就是程序执行的一个过程,它会去分配内存资源,cpu的调度。

那么进程和程序之间的区别呢?

程序:程序是静态的(存储在硬盘中的代码,它是数据的集合)

进程:进程是动态的(程序的执行的过程,包括进程的创建,调度,消亡).c---->a.out---->process(pid)

1) 程序是永存的,而进程是短暂的。

2) 进程有程序状态的变化,程序没有。

3) 进程可以并发,程序无并发。

4) 进程与进程之间会存在竞争计算机的资源的。

5) 一个程序可以多次运行,变成多个进程。

进程的状态

(1)D      uninterruptible sleep (usually IO) 个人理解为深度睡眠状态此状态不会受外界信号的干扰即使是接受到 kill  -9 信号也无法将它杀死。

(2)S     interruptible sleep   (waiting for an event to complete)  这种状态的进程可以接受外部的信号

(3)R     running or runnable(on run queue)         就绪队列中

(4)T     stopped   暂停态。

(5)*W    paging (not valid since the 2.6.xx kernel) 此状态为新增

(6)*X    dead

(7) Z    defunct ("zombie") process,  僵死要避免此时的状态因为如果不收尸  该线程会继续占用资源,并且别的程序无法利用此块的资源。

查询进程相关命令
ps aux | grep  进程名
top //动态获得所有进程状态
ps aux 静态获得所有进程状态

 例如此时,我运行a.out 程序 并使用 ps aux | grep  a.out查询 进程状态 , 可以发现此时它拥有一个父进程1个子进程  并且都处于S+状态(注S和D都属于阻塞态, 只是 S可以收到信号 , D不可以 only  I/O)。

kill命令

	kill -l //查看信号列表 

在中断输入  kill -l 可以获得kill命令所有的可用信号

1) SIGHUP       终端的控制进程结束,通知session内的各个作业,脱离关系 
2) SIGINT       程序终止信号(Ctrl+c)
3) SIGQUIT      和2号信号类似(Ctrl+\),产生core文件
4) SIGILL       执行了非法指令,可执行文件本身出现错误 
5) SIGTRAP      有断点指令或其他trap指令产生,有debugger使用
6) SIGABRT      调用abort函数生成的信号 
7) SIGBUS       非法地址(内存地址对齐出错)
8) SIGFPE       致命的算术错误(浮点数运算,溢出,及除数为0 错误)
9) SIGKILL      用来立即结束程序的运行(不能为阻塞,处理,忽略)
10) SIGUSR1     用户使用 

11) SIGSEGV     访问内存错误
12) SIGUSR2     用户使用
13) SIGPIPE     管道破裂
14) SIGALRM     时钟定时信号
15) SIGTERM     程序结束信号(可被阻塞,处理)
16) SIGSTKFLT   协处理器栈堆错误
17) SIGCHLD     子进程结束,父进程收到这个信号并进行处理,(wait也可以)否则僵尸进程
18) SIGCONT     让一个停止的进程继续执行(不能被阻塞)
19) SIGSTOP     让一个进程停止执行(不能被阻塞,处理,忽略)
20) SIGTSTP     停止进程的运行(可以被处理和忽略)

21) SIGTTIN     当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.
22) SIGTTOU     类似SIGTTIN,但在写终端时收到
23) SIGURG      有紧急数据或者out—of—band 数据到达socket时产生
24) SIGXCPU     超过CPU资源限定,这个限定可改变
25) SIGXFSZ     当进程企图扩大文件以至于超过文件大小资源限制
26) SIGVTALRM   虚拟时钟信号(计算的是该进程占用的CPU时间)
27) SIGPROF     时钟信号(进程用的CPU时间及系统调用时间)
28) SIGWINCH    窗口大小改变时发出
29) SIGIO       文件描述符准备就绪,可以进行读写操作
30) SIGPWR      power failure
31) SIGSYS      非法的系统调用

34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

例如输入  kill -9  +程序pid号码  可以立即让程序结束

                                                                 fork函数


1.fork();
    pid_t fork();
    叉子
    一次调用,会返回两次。
    子进程先运行和是父进程先进程,顺序不确定。
    变量不共享。
    
    子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。
    
    功能:通过该函数可以从当前进程中克隆一个同名新进程。
          克隆的进程称为子进程,原有的进程称为 父进程。
          子进程是父进程的完全拷贝。
          子进程的执行过程是从fork函数之后执行。
          子进程与父进程具有相同的代码逻辑。

    返回值:int 类型的数字。
            在父进程中:成功 返回值是子进程的pid号 >0
                        失败 返回-1;
            在子进程中:成功 返回值 0
                        失败 无
                        

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
	pid_t pid = fork();
	if(pid < 0)
	{
		perror("create fork error");
		return -1;
	}
	if(pid > 0)
	{
		printf("is father---------pid = %d\n", getpid());
	}
	else if(pid == 0)
	{
		printf("is child----------pid = %d\n", getpid());
	}

	printf("tst fork  pid = %d\n", getpid());

	return 0;
}

linux内核通过一个唯一的进程标识值PID来标识每个进程。(调用getpid()可得到当前进程的pid号, getppid()可以获得父进程的PID号)

 运行结果输出父子进程的pid号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值