一、fork调用
#include
SRCS=$(wildcard *.c)
OBJS=$(SRCS:.c=.o)
CC=gcc
CFLAGS=-g -Wall
my_app:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) -c $< $(CFLAGS)
clean:
rm *.o
makefile编写的另外一个实例,源文件是my_app.c文件,生成my_app.o文件。
.PHONY:clean all
CC=gcc
CFLAGS=-g -Wall
BIN=my_app
all:$(BIN)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm *.o
最简单的一个fork程序
#include<stdio.h>
#include <unistd.h>
#include<errno.h>
int main()
{
pid_t fd = fork();
if(fd == -1 )
{
perror("fun fork() err\n");
return -1;
}
if(fd > 0)
{
printf("this is parrnt !\n");
printf("parent PID=%d\n", getpid());
return 0;
}
if(fd == 0)
{
printf("this is child process!\n");
printf("parent PID=%d , child PID=%d\n",getpid() ,getppid());
return 0;
}
}
在此基础上做一个多进程的压力测试框架
#include<stdio.h>
#include <unistd.h>
#include<errno.h>
int main()
{
int i = 0;
int procNum = 100;
pid_t fd;
for(i = 0 ; i < procNum ; i++)
{
fd = fork();
if(fd == 0)
{
printf("%d:",i);
printf("this is child process!");
printf("parent PID=%d , child PID=%d\n",getppid() ,getpid());
exit(0);
}
}
// for(i = 0 ; i < procNum ; i++)
//{
// wait(NULL);
//}
printf("fork end!\n");
return 0;
}
父进程一直在创建子进程,子进程做测试的一个多进程测试框架,其中注释的部分放开,那么最后父进程没有替子进程收尸,那么就出现了孤儿进程,还有可能产生僵死进程。
还有一个测试框架就是父进程产生子进程,子进程在产生子进程,迭代产生子进程。
这里写代码片
写时复制
创建子进程的时候,内核的各段copy到子进程,这时就出现了写时复制原则。当父或子进程修改内存中的数据时,那么写时复制就出现了。那时,只是拷贝需要的那一页,其中就出现了缺页中断,这也出现了内存的页式管理。