多进程程序设计

创建进程

函数名:fork

函数原型:pid_t fork(void);

函数功能:创建一个子进程

头文件;<unistd.h>

返回值:成功:在父进程中返回子进程的pid,在子进程中返回0    失败:-1

#include <unistd.h>

void main()
{
	fork();
	printf("program is end\n");
	
	exit(0);
}

运行结果:program is end
          program is end

结果分析:fork函数一旦被调用,在内存中会产生一个新的进程,新进程与父进程代码是一样的,它是从fork之后的语句开始执行
#include <unistd.h>

void main()
{
	pid_t pid;
	
	pid = fork();
	printf("pid is %d\n",pid);
	
	exit(0);
}
运行结果:pid is 3003
          pid is 0
#include <unistd.h>

void main()
{
	pid_t pid;
	
	pid = fork();
	
	if(pid > 0)
	{
		printf("This is father process\n");
		exit(0);
	}
	else
	{
		printf("This is child process\n");
		exit(0);
	}
}

运行结果:This is father process
          This is child process
创建进程

函数名:vfork

函数原型:pid_t vfork(void);

函数功能:创建一个子进程,并阻塞父进程

头文件:<sys/types.h> <unistd.h>

返回值:成功:在父进程中返回子进程的pid,在子进程中返回0    失败:-1

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

void main()
{
	pid_t pid;
	
	pid = vfork();
	
	if(pid > 0)
	{
		printf("This is father process\n");
		exit(0);
	}
	else
	{
		printf("This is child process\n");
		exit(0);
	}
}

运行结果:This is child process
          This is father process

思考以下程序的运行结果:

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

void main()
{
	pid_t pid;
	int count = 0;
	
	pid = fork();
	count++;
	printf("count = %d\n",count);
	exit(0);
}
运行结果:count = 1
          count = 1
#include <stdio.h>
#include <unistd.h>

void main()
{
	pid_t pid;
	int count = 0;
	
	pid = vfork();
	count++;
	printf("count = %d\n",count);
	exit(0);
}
运行结果:count = 1
          count = 2
fork对比vfork

1. fork:子进程拥有独立的数据段和堆栈

    vfork:子进程与父进程共享数据段和堆栈

2. fork:父子进程的执行次序不确定

    vfork:子进程先运行,父进程后运行

进程退出

正常退出时,父进程可以使用return 0;和exit(0);子进程只能使用exit(0);

不正常退出时,使用exit(1);

进程等待

函数名:wait

函数原型:pid_t wait(int *status);

函数功能:挂起调用它的进程,直到其子进程结束

头文件:<sys/types.h> <sys/wait.h>

返回值:成功:返回终止的那个子进程的id   失败:-1

参数说明:status记录子进程的退出状态

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

void main()
{
    pid_t pid;
	
    pid = fork();
    if(pid > 0)
    {
        wait(NULL);
	printf("This is father process\n");
	exit(0);
    }
    else
    {
	printf("This is child process\n");
	exit(0);
    }
}
运行结果:This is child process
          This is father process

执行程序

函数名:execl    还有system

函数原型:int execl(const char *pathname,const char *arg...);

函数功能:运行可执行文件

头文件:<unistd.h>

返回值:成功不返回,失败才返回

参数说明:pathname:要运行的可执行文件的路径    arg:可执行文件运行需要的参数,第一个为文件名并以NULL结束

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

void main()
{
	pid_t pid;
	
	pid = fork();
	if(pid > 0)
	{
		wait(NULL);
		printf("This is father process\n");
		exit(0);
	}
        else
	{
		execl("/bin/ls","ls","/home/",NULL);
		printf("This is child process\n");
		exit(0);
	}
}
运行结果:wind
          This is father process

注意:

    fork创建一个新的进程,产生一个新的pid

    exec保留原有的进程,但代码替换成了新的代码,执行新的代码


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。