进程控制篇代码示例(复习)

/* 创建一个进程 */

#include "Process.h"  /* 自己写的头文件 */

int main()
{
	pid_t pid;

	printf("Fork pid:%d\n",getpid());
	pid = fork();
	if(-1 == pid)
	{
		perror("fork");
		exit(1);
	}
	else if(0 == pid)
	{
		printf("Child Process!\n");
		printf("Child Pid:%d \n",getpid());
	}
	else
	{
		printf("Parent Process!\n");
		printf("Parent Pid:%d \n",getpid());
		waitpid(pid,NULL,0);    //确保父进程后结束
	}

	return 0;
}



/* 1.在以上的程序中经过多次执行,有时候会出现父进程
	先执行,造成子进程变成孤儿进程?该如何解决?  */

/* 解决方法:使用 waitpid(); 函数,确保父进程后结束 */


/* 2.进过多次执行,可以发现 子进程号 与 父进程号 是连在一起的.
	且子进程号 比 父进程号 大1      */ 









/* fork2.c */
/* fork 创建的子进程 与 父进程 到底有什么关系呢 ?  */

#include "Process.h"  //自己写的头文件

int main()
{
	pid_t pid;
	int count = 0;

	pid = fork();
	if(-1 == pid)   //返回值为-1,判断出错
	{
		perror("fork");
		exit(1);
	}
	else if(0 == pid)   //返回值为0,判断为子进程
	{
		count++;
		printf("Child  count :%d \n",count);
	}
	else   //否则,为父进程
	{
		count++;
		printf("Parent  count :%d \n",count);
		waitpid(pid,NULL,0);
	}

	return 0;
}


/* 结论: 1.子进程 完全复制 父进程 的资源;
         2. "写时复制" 
		 3.子进程 与 父进程 占用不同的虚拟内存空间 
*/









/* vfork 创建进程 */

/* 1.vfork 子进程 与 父进程 又有什么关系呢?  
   2.vfork 与 fork 的区别与联系
*/

#include "Process.h"

int main()
{
	pid_t pid;
	int count = 0;

	pid = vfork();
	if(-1 == pid)
	{
		perror("vfork");
		exit(1);
	}
	else if(0 == pid)
	{
		printf("Child Process! \n");
		count++;
		printf("Child count :%d \n",count);
		exit(2);      //子进程需手动退出
	}
	else
	{
		printf("Parent Process!\n");
		count++;
		printf("Parent count :%d \n",count);
	}

	return 0;
}


/* vfork的特点:
	1.子进程需要手动退出 (与fork不同)
	2.每次都是子进程先执行, 父进程后执行  (与fork不同)
	3.创建的 子进程 与 父进程 共享空间    (与fork不同)
	4.当然,与fork 的相同点是: 都可以创建进程
*/















/* vfork的案例应用:子进程中另起一个新进程 */

#include "Process.h"

int main()
{
	pid_t pid;

	pid = vfork();
	if(-1 == pid)
	{
		perror("vfork");
		exit(1);
	}
	else if(0 == pid)
	{
		printf("Child Pid:%d \n",getpid());
		execl("/mnt/hgfs/share/example/Linux/process/fork","./fork",NULL);   //另起的进程./fork
	}
	else
	{
		printf("Parent Process!\n");
	}

	return 0;
}


/* vfork 中 子进程另起的进程与子进程 有相同的进程号  */












/* 父进程写 子进程读 */
/* waitpid.c 案例应用 */

#include "Process.h"

void ChildRead()
{
	int fd,ret;
	char buf[20] = {0};

	fd = open("hello.txt",O_RDONLY);
	if(-1 == fd)
	{
		perror("open1");
		exit(2);
	}

	ret = read(fd,buf,sizeof(buf));
	if(-1 == ret)
	{
		perror("read");
		exit(3);
	}
	else
	{
		printf("Read from txt:%s\n",buf);
		memset(buf,0,sizeof(buf));
	}
	
	close(fd);
}


void ParentWrite()
{
	int fd;
	int ret;
	char buf[20] = {0};
 
	fd = open("hello.txt",O_CREAT | O_WRONLY);
	if(-1 == fd)
	{
		perror("open2");
		exit(4);
	}

	printf("Please input the string:\n");
	scanf("%s",buf);

	ret = write(fd,buf,strlen(buf));
	if(-1 == ret)
	{
		perror("write");
		exit(5);
	}
	
	close(fd);
}


int main()
{
	pid_t pid;

	pid = fork();
	if(-1 == pid)
	{
		perror("fork");
		exit(1);
	}
	else if(0 == pid)
	{
		sleep(4);
		ChildRead();
	}
	else
	{
		ParentWrite();
		waitpid(pid,NULL,0);
	}

	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>