Linux进程 -- fork操作
fork函数
#include <unistd.h>
pid_t fork(void);
功能:子进程复制父进程的0到3G空间和父进程中的PCB,但是id号不同。
特点:调用一次,返回两次。
- 父进程中返回子进程ID
- 子进程中返回0
- 读时共享,写时复制
fork示例:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
pid_t pid;//进程id
char *message;
int n;
pid = fork();
if (pid < 0) { //创建进程失败
perror("fork failed");
exit(1);
}
if (pid == 0) { //子进程
message = "This is the child\n";
n = 6;
} else { //父进程
message = "This is the parent\n";
n = 3;
}
for(; n > 0; n--) {
printf(message);
sleep(1);
}
return 0;
}
如上图,fork()
后子进程复制父亲代码段产生。
进程相关函数
getpid/getppid
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); //返回调用进程的PID号
pid_t getppid(void); //返回调用进程父进程的PID号
getuid/geteuid
#include <unistd.h>
#include <sys/types.h>
uid_t getuid(void); //返回实际用户ID
uid_t geteuid(void); //返回有效用户ID
getgid/getegid
#include <unistd.h>
#include <sys/types.h>
gid_t getgid(void); //返回实际用户组ID
gid_t getegid(void); //返回有效用户组ID
fork与vfork的区别
vfork函数
#include <unistd.h>
pid_t vfork(void);
函数说明:vfork()会产生一个新的子进程。
但是vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行。
vfork与fork的区别
vfork()用法与fork()相似,但是也有区别,具体区别归结为以下3点:
- fork():子进程拷贝父进程的数据段,代码段。vfork():子进程与父进程共享数据段。
- fork():父子进程的执行次序不确定。
vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec或_exit之后父进程才可能被调度运行。 - vfork()保证子进程先运行,在它调用
exec
或_exit
之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。 - 当需要改变共享数据段中变量的值,则拷贝父进程。
还没有评论,来说两句吧...