linux创建进程fork函数和vfork函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/andrewgithub/article/details/82055805
       #include <unistd.h>

       pid_t fork(void);

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

       pid_t vfork(void);

返回:子进程中为0,父进程中为子进程ID,出错返回  -1

fork创建的新进程被称为子进程,该函数被调用一次但是返回两次,两次返回的区别是:在子进程中的返回值是,在父进程中的返回值是新的子进程的进程ID;

创建子进程,父进程哪个先运行根据系统的调度且复制父进程的内存空间。


vfork函数,创建子进程,但是子进程先运行且不复制父进程的内存空间。

fork函数示例:

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



int		glob = 6;		/* external variable in initialized data */
char	buf[] = "a write to stdout\n";

int
main(void)
{
	int		var;		/* automatic variable on the stack */
	pid_t	pid;

	var = 88;
	if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
		perror("write error");
	printf("before fork\n");	/* we don't flush stdout */

	if ((pid = fork()) < 0) {
		perror("fork error");
	} else if (pid == 0) {		/* child */
		glob++;					/* modify variables */
		var++;
	} else {
		sleep(2);				/* parent */
	}

	printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
	exit(0);
}

编译之后运行结果:

andrew@andrew-Thurley:~/work/apue.2e$ ./a.out
a write to stdout
before fork
pid = 16935, glob = 7, var = 89
pid = 16934, glob = 6, var = 88
#include <unistd.h>  
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>




int		glob = 6;		/* external variable in initialized data */

int
main(void)
{
	int		var;		/* automatic variable on the stack */
	pid_t	pid;

	var = 88;
	printf("before vfork\n");	/* we don't flush stdio */
	if ((pid = vfork()) < 0) {
		perror("vfork error");
	} else if (pid == 0) {		/* child */
		glob++;					/* modify parent's variables */
		var++;
		_exit(0);				/* child terminates */
	}

	/*
	 * Parent continues here.
	 */
	printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
	exit(0);
}

编译之后运行结果:

andrew@andrew-Thurley:~/work/apue.2e$ ./a.out
before vfork
pid = 17047, glob = 7, var = 89

猜你喜欢

转载自blog.csdn.net/andrewgithub/article/details/82055805
今日推荐