4进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()



1fork()函数

子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。fork调用一次返回两次,有以下特点:

A:父进程中返回子进程ID

B:子进程中返回0

C:读时共享,写时复制

2fork()依赖的头文件

#include <unistd.h>

3fork()函数说明:

pid_tfork(void);

通过该函数创建一个子进程

4案例说明:

总结:

A因为读时共享和写时复制,子进程会复制父进程的代码,但是从fork下开始执行。但是,当在fork前定义父子进程都用到的变量的时候,这时候父子进程并不是同时操作这个变量,而是相互独立的,也就是说:子进程指定自己的n,不会在父进程的n的基础上操作。

5.getpid/getppid

A依赖的头文件

#include <unistd.h>

#include<sys/types.h>

B函数声明

uid_t getuid(void);  
//返回实际用户ID

uid_t geteuid(void); 
//返回有效用户ID

C:案例说明

6.getuid()函数

A依赖的头文件

#include <unistd.h>

#include <sys/types.h>

B函数声明

uid_t getuid(void);   
//获得用户id

uid_t geteuid(void);  
//获得有效的用户id

函数说明:

通过getuid()函数和geteuid()函数获得用户的id

案例说明:

运行结果:

7.getgid()函数

A:依赖的头文件

#include <unistd.h>

#include <sys/types.h>

B函数声明

gid_t getgid(void);

gid_t getegid(void);

函数说明:

通过这个函数实现获得组的id

C案例说明:

运行结果:

vfork

用于fork后马上调用exec函数

父子进程,公用同一地址空间,子进程如果没有马上exec而是修改了父进程得到的变量值,此修改会在父进程中生效

设计初衷,提高系统效率,减少不必要的开销

现在fork已经具备读时共享写时复制机制,vfork逐渐废弃。

时间: 2024-08-06 01:49:35

4进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()的相关文章

进程创建fork 、getpid 、getppid

创建一个进程: /******************** *功能:创建一个新进程,通过复制当前进程(和父进程一样),执行的位置都一样 *pid_t:一般是16位的有符号的整型数,不够可以typedef * 返回值:非0 :“在父进程中”--->返回子进程编号 * 0 :”在子进程中“--->返回0 * -1 :失败,并设置errno * ****************/ pid_t fork(void); 父子进程区别:fork的返回值不一样 pid不同 ppid不同 未决信号(未响应的信

判断指定进程是否为x64的方法(在ntdll判断某个x64函数是否存在)

[cpp] view plain copy BOOL IsWow64ProcessEx(HANDLE hProcess) { // 如果系统是x86的,那么进程就不可能有x64 bool isX86 = false; #ifndef _WIN64 isX86 = GetProcAddress(GetModuleHandle(TEXT("ntdll")), "NtWow64DebuggerCall") == nullptr ? TRUE : FALSE; #endif

进程原语

linux C/C++:进程原语 1. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 2. 进程环境 在libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明.用以下代码可以查看当前进程的所有环境变量的信息. #include <stdio.h> int main(void) { extern char **environ; int i; f

linux c学习笔记----进程创建(fork,wait,waitpid)

1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样. (2)为了区分父进程和子进程,我们必须跟踪fork 的返回值. 当fork 掉用失败的时候(内存不足或者是用户的最大进程数已到)fork 返回-1,否则fork 的返回值有重要的作用.对于父进程fork 返回子进程的ID,而对于fork 子进程返回0.我 们就是根据这个返回值来区分父子进程的

进程派生——fork~~~

跌跌撞撞,unix也看到了进程管理,顿时觉得高大上了.然而面对第一个系统调用fork,这英语发音实在是蹩脚,差点就读成--. 在unix里面,对于任何一个进程,都有一个唯一表示的进程ID(pid)当然除了进程ID这个标识之外还有很多其他属性:父进程ID(ppid),进程实际用户ID,进程有效用户ID,进程实际用户组ID,进程有效用户组ID.对于这些属性,可以使用下列函数获取 #include<unistd.h> pid_t getpid(void); pid_t getppid(void);

5进程原语:execl(),execlp(),execle(),execv(),execvp(),execvp(),execve()

 1.exec族依赖的头文件 #include<unistd.h> extern char**environ; 2函数声明 //第一个参数:可执行程序所在的绝对位置 //第二个参数:可执行程序运行时所需的参数,这里是一个可变参数,每个参数之间用逗号分割 //参数结束时,最后一个参数是:NULL int execl(constchar *path, const char *arg, ...); //注意,这里函数名加了p,表示调用了系统的环境变量中配置的PATH,查看环境变量命令:Echo

函数的可重入性、线程安全函数、异步信号安全函数

重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰.,常见的情况是,程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行的函数foo(),这样便发生了所谓的重入.此时如果foo()能够正确的运行,而且处理完

Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)

2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢? 使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数. 而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利

Python进程分支fork和exec详解

在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独立父进程外运行. fork()是一个很特殊的方法,一次调用,两次返回. fork()它会返回2个值,一个值为0,表示在子进程返回;另外一个值为非0,表示在父进程中返回子进程ID. 以下只能在linux中运行,不能在window下运行. 进程分支fork() 实例如下: #!/usr/bin/python