版权声明:本文为博主原创文章,未经博主允许不得转载。 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