多进程程序设计

创建进程

函数名: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保留原有的进程,但代码替换成了新的代码,执行新的代码

时间: 2024-10-07 05:53:43

多进程程序设计的相关文章

多进程程序设计,王明学learn

多进程程序设计 一.函数学习 1.1 创建进程fork 1.1.1 函数原形 pid_t fork(void); 1.1.2 函数功能 创建一个子进程 1.1.3 所属头文件 <unistd.h> 1.1.4 返回值 成功:父进程返回创建成功的子进程pid子进程返回 0 失败:父进程返回 1.1.5 参数说明 无 1.2 创建进程vfork 1.2.1 函数原形 Pid_t  vfork(); 1.2.2 函数功能 创建一个子进程,并阻塞父进程 1.2.3 所属头文件 <sys/type

linux应用开发-多进程程序设计

linux应用开发-多进程程序设计 一 创建进程 fork和vfork的区别 1 fork创建的子进程有自己的数据段和堆栈而vfork创建的子进程跟父进程共享数据段 二 进程退出 父进程能使用return 0和exit(0)而子进程只能使用exit(0) 三 execl和fork的区别 execl不创建子进程,而是覆盖后面的代码段 fork创建子进程,不覆盖代码段 四 相应的函数 1 创建进程 函数名   fork 函数原形 pid_t fork(void) 函数功能 创建一个子进程 所属头文件

[国嵌攻略][079][多进程程序设计]

fork.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> void main(){ int pid; pid = fork(); printf("pid is %d\n", pid); exit(0); } vfork.c #include <stdio.h> #include <stdlib.h> #include <sys/types.h>

linux_c 网络开发日记(4)多进程程序设计

获取ID #include<sys/types.h> #include<unsstd.h> .pid_t getpid(void) 获取本进程ID .pid_t gettppid(void) 获取父进程ID eg: #include<stdio.h> #include<unistd.h> #include<stdlib.h> int main (void) { printf("PID = %d\n", getpid()); p

Linux多进程程序设计

用到的函数的功能主要有获取进程id.创建进程.进程退出.进程等待.执行程序. 获取进程id:getpid(),getppid() 创建进程:fork(),vfork() 进程退出:exit() 进程等待:wait() 执行程序:exec(),system() getpid函数 原型:pid_t getpid(void) 头文件:<unistd.h><sys/types.h> 功能:返回调用该函数的进程id,且该函数总是运行成功 getppid函数 原型:pid_t getppid(

一点小感受:界面和程序的分离

1 Windows桌面程序,界面和程序是源码级混合 Windows系统下的GUI程序,界面(GUI)与程序其他部分逻辑上是分离的,但是源码上直接交互,界面功能直接通过调用Win32 API来实现. 例:CreateWindow(). 写Windows桌面程序,必须调用GUI32.dll导出的API,无他可选. 甚至线程模型很多功能都和GUI窗口绑定到了一起,如消息队列. 2 Linux程序,界面和程序是通过协议通信 2.1 CUI程序和文本终端通过终端协议交互 对于CUI的程序来说,文本终端是通

嵌入式开发-写在这里作为参照

第一部分:Linux平台搭建与环境熟悉 了解linux系统:区分各种版本的Linux系统,以便于拓展 Linux视野.1.Linux 简介:2.Linux 系统的主要特点:3.Linux 的组成:4.主要的 Linux 版本:5.嵌入式 Linux简介与发展 第二部分虚拟机安装和LINUX系统安装 1.虚拟机安装:2.Linux系统的安装:3.Linux系统的常用软件的安装:4.Linux快速入门5. 熟悉运用 Linux环境下,常用命令的操作与系统设置,如常用的 Shell:掌握基本的 She

windows进程间通信

windows进程间通信 分类: 网络编程 2011-12-27 09:56 9372人阅读 评论(2) 收藏 举报 windows dll 服务器 sockets socket api 摘 要: 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microsoft Win32 API提供了多种进程间通信的方法,全面地阐述了这些方法的特点,并加以比较和分析,希望能给读者选

AIDL完全学习手册

1.引言 打开Android源码,会发现在有些包的里面,在各个java类下面总是会有若干白色图标的文件,后缀为aidl.双击打开,也是一篇黑白,没有java代码的关键字变色突示,写法似java又总有些不同.这个文件好生怪异! 它到底是什么?有什么作用?怎么使用? 2.释义 AIDL(Android Interface Definition Language,Android接口定义语言). 很多文章在引出AIDL之前,都会问"Android进程间如何通信?",然后说出"是的,用