首页 > 系统服务 > 详细

11进程

时间:2015-03-27 06:20:51      阅读:231      评论:0      收藏:0      [点我收藏+]

这节主要讲一个系统调用:fork

pid_t fork(void);

功能是:创建一个子进程
返回值:
如果成功创建一个子进程,对于父进程来说返回子进程ID
如果成功创建一个子进程,对于子进程来说返回值为0
如果为-1表示创建失败
注意:这里是一个程序具有了两个返回值。
技术分享
如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)这是子进程就成为了孤儿进程。
如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵尸进程。
这里我们献上一个小例子供大家运行理解:
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>

#define ERR_EXIT(m) 	do 	{ 		perror(m); 		exit(EXIT_FAILURE); 	} while(0)

int main(int argc, char *argv[])
{
	signal(SIGCHLD, SIG_IGN);//这个信号量可以防止产生僵尸进程
	printf("before fork pid = %d\n", getpid());
	pid_t pid;
	pid = fork();
	if (pid == -1) //创建进程失败
		ERR_EXIT("fork error");

	if (pid > 0)    //父进程中返回子进程的pid
	{
		//这是在父进程空间里执行
		printf("this is parent pid=%d childpid=%d\n", getpid(), pid);
		sleep(100);
	}
	else if (pid == 0) //返回0就是在子进程的空间里运行了
	{
		printf("this is child pid=%d parentpid=%d\n", getpid(), getppid());
	}
	return 0;
}

虽然注释很多了但是也要简单的介绍一下:

首先这是一个多组合的例子:

1、可以去掉signal信号量和sleep(100),看一下程序的运行结果,主要看相关进程号的打印。有可能父进程先结束。

2、在父进程里边加上一个sleep(1),试看一下进程号的打印,肯定会不同。

3、加上signal的目的就是为了防止僵尸进程的产生。具体会在信号量哪一节讲到。(特备注意)

11进程

原文:http://www.cnblogs.com/DamonBlog/p/4370540.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!