1.进程的创建
#include<myhead.h>
int main(int argc, const char *argv[])
{
	printf("hello world\n");//父进程执行的内容
	int num=520;//在父进程中定义的变量
	pid_t pid=fork();//创建子进程
	if(pid>0)
	{
		while(1)
		{
			printf("我是父进程,num=%d\n",num);
			sleep(1);
		}
	
	}
	else if(pid==0)
	{
		num=1314;//更改子进程中的num的值
		while(1)
		{
			printf("我是子进程,num=%d\n",num);
			sleep(1);
		}
	
	}else
	{
		perror("fork error");
		return -1;
	}
	
	return 0;
}
2.进程号的获取
#include<myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid=-1;
	//创建一个子进程
	pid=fork();
	//判断父子进程
	if(pid>0)
	{
		printf("我是父进程,当前进程id号:%d,ppid=%d\n",getpid(),getppid());
	}
	else
	{
		printf("我是子进程,当前进程id号:%d,ppid=%d\n",getpid(),getppid());
	
	}
	while(1);
	return 0;
}
3.回收进程资源wait
#include<myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid=-1;
	//创建一个子进程
	pid=fork();
	//判断父子进程
	if(pid>0)
	{
		printf("我是父进程,当前进程id号:%d,ppid=%ildid=%d\n",getpid(),getppid(),pid);
		//调用进程退出函数
		//exit(EXIT_SUCCESS);//会刷新缓冲区
		//_exit(EXIT_SUCCESS);//不会刷新缓冲区
	}
	else
	{
		printf("我是子进程,当前进程id号:%d,ppid=%d\n",getpid(),getppid());
		sleep(3);
		exit(EXIT_SUCCESS);//会刷新缓冲区
	
	}
	wait(NULL);//阻塞等待子进程结束
	printf("已经成功回收子进程\n");
	while(1);
	return 0;
}
4.waitpid回收僵尸进程
#include<myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid=fork();//创建子进程
	if(pid>0)
	{
		printf("我是父进程\n");
		//sleep(5);
	}
	else if(pid==0)
	{
		printf("我是子进程\n");
		sleep(3);
		//退出子进程
		exit(EXIT_SUCCESS);
	}
	else
	{
		perror("fork error");
		return -1;
	}
	//使用waitpid以非阻塞的形式回收僵尸进程
	if(waitpid(-1,NULL,WNOHANG)>0)
	{
		printf("成功回收一个僵尸进程\n");
	}
	printf("父进程要结束了\n");
	return 0;
}
5.使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程资源。
#include<myhead.h>
//定义获取文件长度的函数
int get_file_len(const char *srcfile,const char *destfile)
{
	//以只读的形式打开源文件
	int srcfd,destfd;
	if((srcfd=open(srcfile,O_RDONLY))==-1)
	{
		perror("open srcfile error");
		return -1;
	}
	//以只写和创建的形式打开目标文件
	if((destfd=open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open destfile error");
		return -1;
	}
	//求源文件的大小
	int len=lseek(srcfd,0,SEEK_END);
	//关闭两个文件
	close(srcfd);
	close(destfd);
	return len;
}
//定义文件拷贝函数
int copy_file(const char *srcfile,const char *destfile,int start,int len)
{
	//以只读的形式打开源文件,以只写的形式打开目标文件
	int srcfd,destfd;
	if((srcfd=open(srcfile,O_RDONLY))==-1)
	{
		perror("srcfile open error");
		return -1;
	}
	if((destfd=open(destfile,O_WRONLY))==-1)
	{
		perror("destfile open error");
		return -1;
	}
	//移动文件的光标
	lseek(srcfd,start,SEEK_SET);
	lseek(destfd,start,SEEK_SET);
	//完成拷贝工作
	char buf[128]="";
	int sum=0;
	while(1)
	{
		int res=read(srcfd,buf,sizeof(buf));
		sum+=res;//将每次读取的数据放入sum中
		if(sum>=len||res==0)
		{
			write(destfd,buf,res-(sum-len));//将最后一次的内容写入
			break;
		}
		//将读取的数据写入目标文件
		write(destfd,buf,res);
	}
	//关闭文件
	close(srcfd);
	close(destfd);
	return 0;
}
int main(int argc, const char *argv[])
{
	//判断外部传参
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage:./a.out srcfile destfile\n");
		return -1;
	}
	//定义变量获取源文件长度
	int len=get_file_len(argv[1],argv[2]);
	//创建多进程
	pid_t pid=fork();
	//皮带父子进程
	if(pid>0)
	{
		//父进程
		copy_file(argv[1],argv[2],0,len/2);//父进程拷贝前一半
		//阻塞等待子进程结束
		wait(NULL);
	}
	else if(pid==0)
	{
		//子进程	
		copy_file(argv[1],argv[2],len/2,len-len/2);//子进程拷贝后一半
		//退出进程
		exit(EXIT_SUCCESS);
	}
	else
	{
		perror("fork error");
		return -1;
	}
	printf("拷贝成功\n");
	return 0;
}
6.









![[计网底层小探索]:实现并部署多线程并发Tcp服务器框架(基于生产者消费者模型的线程池结构)](https://img-blog.csdnimg.cn/direct/c033820068dd452f96c57916b5fce352.jpeg#pic_center)









