Linux教程

42.Linux 进程控制

本文主要是介绍42.Linux 进程控制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

fork函数

        创建一个子进程。

 头文件:       

 #include <sys/types.h>
 #include <unistd.h>

函数原型:       

pid_t fork(void);

返回值:

RETURN VALUE
       On success, the PID of the child process is returned in the parent, and
       0  is returned in the child.  On failure, -1 is returned in the parent,
       no child process is created, and errno is set appropriately.
返回值: 成功后,子进 程的pid将返回到父级中,并且 在子节点中返回0。当失败时,将在父文件中返回-1, 没有创建任何子进程,并且正确地设置了errno。 

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
	printf("before fork--1--\n");
	printf("before fork--2--\n");
	printf("before fork--3--\n");
	printf("before fork--4--\n");
	printf("before fork--5--\n");
	
	pid_t pid=fork();
	if(pid == -1)
	{
		perror("fork error");
		exit(1);
	}
	else if(pid==0)
	{
		printf("---child is created\n");
	}
	else if(pid>0)
	{
		printf("---parent process:my child is %d\n",pid);
	}

	printf("=================end of file\n");
	return 0;
}

执行结果如下:

当使用fork函数以后,先执行完父进程,再执行子进程。

使用getpid(),getppid()函数获取进程的本身的pid、和本进程对应的父进程pid

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
	printf("before fork--1--\n");
	printf("before fork--2--\n");
	printf("before fork--3--\n");
	printf("before fork--4--\n");
	printf("before fork--5--\n");
	
	pid_t pid=fork();
	if(pid == -1)
	{
		perror("fork error");
		exit(1);
	}
	else if(pid==0)
	{
		printf("---child is created,pid=%d,parent-pid=%d\n",getpid(),getppid());
	}
	else if(pid>0)
	{
		printf("---parent process:my child is %d,my pid:%d,my parent pid:%d\n",pid,getpid(),getppid());
	}

	printf("=================end of file\n");
	return 0;
}

执行结果如下:

 

题目:

一次fork函数调用可以创建一个子进程。那么创建N个子进程应该怎么实现呢?

简单想,for(i=0;i<n;i++){frok()}即可。但这样创建的是N个子进程吗?

例如:for(i=0;i<3 ;i++)

        fork();

 答案:2的3次方=8,因为有一个是父进程,所以产生了七个子进程。

从上图我们可以很清晰的看到,当n为3时候,循环创建了(2^n-1)个子进程,而不是N个子进程。需要在循环的过程,保证子进程不再执行fork,因此当(fork()==0)时,子进程来个break才正确。

 实现程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
	pid_t pid;
	for(int i=0;i<5;i++)
	{
		pid=fork();
		if(pid==0)
		{
			break;
		}
		if(i==5)
		{
			sleep(1);
			printf("I'm parent\n");
		}
		else
			printf("I'm %dth child\n",i+1);
	}
	return 0;
}

执行结果如下:

 

这篇关于42.Linux 进程控制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!