`
womendu
  • 浏览: 1478425 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

系统调用-进程创建函数基本用法1

阅读更多

* 本文的系统调用的分析基于ARM体系结构
* CrossTool:gcc-3.4.5,libc库:glibc-2.3.6
* 本文的内容均来自arm交叉编译工具链目录下的相关头文件

linux中,进程和线程对内核而言都被看作任务,平等参与调度。本文深入追踪讨论几种创建任务的用户态函数:
fork、vfork、clone、pthread_create,通过这几个函数分析,了解arm体系结构下系统调用的方法,
最终目的是深入讨论内核中进程管理的部分。

用户接口介绍:
fork:
#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
********* sys/types.h ********
#ifndef __pid_t_defined
typedef __pid_t pid_t;
# define __pid_t_defined
#endif
********* unistd.h ***********
/* Clone the calling process, creating an exact copy.
Return -1 for errors, 0 to the new process,
and the process ID of the new process to the old process. */
extern __pid_t fork (void) __THROW;
__THROW意思是使用该fork函数将会抛出一个异常,下同
******************************

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

pid_t vfork(void);
********* sys/types.h ********
#ifndef __pid_t_defined
typedef __pid_t pid_t;
# define __pid_t_defined
#endif
********* unistd.h ***********
#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
/* Clone the calling process, but without copying the whole address space.
The calling process is suspended(唤醒) until the new process exits or is
replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
and the process ID of the new process to the old process. */
extern __pid_t vfork (void) __THROW;
#endif /* Use BSD. */
******************************
++++ fork和vfork的区别 ++++
fork创建一个子进程时,将会创建一个新的地址空间,并且要拷贝父进程的资源,但是往往在子进程中会执行
exec调用,那这样前面的拷贝动作就有点多余了。这种情况下vfork就出现了,它和fork一样都创建一个子进程,
但是它并部将父进程的地址空间完全复制到子进程中,同时在子进程退出或者调
用exec之前,父进程是阻塞的,因为此时子进程使用的是父进程的地址空间。也意味这vfork会保证子进程先
运行,但是如果调用该函数后子进程依赖父进程的进一步执行动作,则会导致系统死锁。
同时子进程在vfork返回后直接运行在父进程的地址空间,并使用父进程的内存和堆栈空间,可能会破坏
父进程的运行环境导致父进程崩溃。
++++++++++++++++++++++++++

clone:
#define _GNU_SOURCE
#include <bits/sched.h>

__BEGIN_DECLS
/* Clone current process. */
#ifdef __USE_MISC
extern int clone (int (*__fn) (void *__arg), void *__child_stack, int __flags, void *__arg) __THROW;
#endif
__END_DECLS

#ifdef __USE_MISC
/* Cloning flags. */
# define CSIGNAL 0x000000ff /* Signal mask to be sent at exit. */
指定子进程结束时发送到父进程的信号编号,通常选择SIGCHLD信号

# define CLONE_VM 0x00000100 /* Set if VM shared between processes. */
进程间共享内存描述符和所有的页表

# define CLONE_FS 0x00000200 /* Set if fs info shared between processes. */
共享根目录, 当前目录, 创建文件初始权限

# define CLONE_FILES 0x00000400 /* Set if open files shared between processes. */
进程间共享打开的文件

# define CLONE_SIGHAND 0x00000800 /* Set if signal handlers shared. */
共享信号处理句柄,阻塞和悬挂的信号。如果这个标识为真,那么CLONE_VM必须也被设置为真

# define CLONE_PTRACE 0x00002000 /* Set if tracing continues on the child. */
如果创建进程可被跟踪,那么该标识表明父进程也希望子进程能被跟踪

# define CLONE_VFORK 0x00004000 /* Set if the parent wants the child to wake it up on mm_release. */
CLONE_VFORK标志设置时,子进程运行时会使父进程投入睡眠,直到子进程不再使用父进程的内存或者子进程退出去才会将父进程唤醒。
这样做是因为父子进程共享同一个地址区域

# define CLONE_PARENT 0x00008000 /* Set if we want to have the same parent as the cloner. */
表明创建进程与子进程是兄弟进程(同父)

# define CLONE_THREAD 0x00010000 /* Set to add to same thread group. */
将孩子进程插入同一个父进程的线程组,强制它共享父进程的信号描述符。如果该标识被设置,CLONE_SIGHAND也必须被设置才有意义

# define CLONE_NEWNS 0x00020000 /* Set to create new namespace. */
表明clone出来的子进程需要自己的名字空间,也就是说,需要对挂载的文件系统需要自己的视角来操作,不要同时指定CLONE_NEWNS和CLONE_FS

# define CLONE_SYSVSEM 0x00040000 /* Set to shared SVID SEM_UNDO semantics. */
共享System V 进程间通信方式:undoable信号量的操作

# define CLONE_SETTLS 0x00080000 /* Set TLS info. */
为线程(轻量级进程)创建一个新的TLS(线程局部存储)段。该段被参数tls指向的结构体所描述。TLS只是对全局量和静态变量才有意义,局部量存在于具体线程的堆栈上。

# define CLONE_PARENT_SETTID 0x00100000 /* Store TID in userlevel buffer before MM copy. */
将子进程的PID写到由ptid参数指向的父进程用户态的变量

# define CLONE_CHILD_CLEARTID 0x00200000 /* Register exit futex and memory location to clear. */
如果存在该标识,当子进程将要退出或者是将要执行一个新的程序时就会触发内核启动一种机制,在这种情况下,内核会清除由ctid参数指向的用户态变量TID,
同时唤醒任意一个等待该事件(子进程死亡)的进程。

# define CLONE_DETACHED 0x00400000 /* Create clone detached. */
遗留标识,会被内核忽略

# define CLONE_UNTRACED 0x00800000 /* Set if the tracing process can't force CLONE_PTRACE on this clone. */
内核设置,覆盖CLONE_PTRACE标识的值(用来内核线程的跟踪禁止)

# define CLONE_CHILD_SETTID 0x01000000 /* Store TID in userlevel buffer in the child. */
子进程的PID写入到有ctid参数指向的子进程的用户模式变量

# define CLONE_STOPPED 0x02000000 /* Start in stopped state. */
强制子进程在TASK_STOPPED状态开始运行
#endif

依赖定义关系:
CLONE_THREAD <-- CLONE_SIGHAND <-- CLONE_VM
定义前者,必须也定义后者才有意义。
在linux内核include/linux/sched.h头文件中,同样存在这上述flags一样的定义,只是多了下面一些宏定义而已:
#define CLONE_NEWUTS 0x04000000 /* New utsname group? */
#define CLONE_NEWIPC 0x08000000 /* New ipcs */
#define CLONE_NEWUSER 0x10000000 /* New user namespace */
#define CLONE_NEWPID 0x20000000 /* New pid namespace */
#define CLONE_NEWNET 0x40000000 /* New network namespace */
#define CLONE_IO 0x80000000 /* Clone io context */


pthread_create:
linux内核只提供来轻量级进程的支持,未实现线程模型。实际上linux用一个轻量级进程对应一个线程,
将线程和进程全部当作任务来调度。linux中所谓的“线程”只是在被创建的时候“克隆”(clone)了父进程的资源,
因此,clone 出来的进程表现为“线程”。目前linux中最流行的线程机制为LinuxThreads,
所采用的就是线程-进程“一对一”模型,调度交给核心 , 而在用户级实现一个包括信号处理在内的线程管理机制。
LinuxThreads由 Xavier Leroy负责开发完成,并已绑定在GLIBC中发行,它实现了一种BiCapitalized面向
linux的Posix 1003.1c“pthread”标准接口。Linuxthread可以支持 Intel、Alpha、MIPS 等平台上的多处理器系统。
按照POSIX 1003.1c标准编写的程序与Linuxthread库相链接即可支持linux平台上的多线程,
在程序中需包含头文件pthread.h,在编译链接加上-Ipthread

#include <pthread.h>
/* Create a thread with given attributes ATTR (or default attributes
if ATTR is NULL), and call function START_ROUTINE with given
arguments ARG. */
extern int pthread_create (pthread_t *__restrict __threadp,
__const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *),
void *__restrict __arg) __THROW;

分享到:
评论

相关推荐

    操作系统实验实验进程管理

    Windows所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或TerminateProcess() API函数终止。通常应用程序的框架负责调用...

    操作系统课程实验.rar

    在系统中根据需要添加新的系统调用是修改内核的一种常用手段,通过本次实验,读 者应理解 linux 系统处理系统调用的流程以及增加系统调用的方法。 内容要求 (1) 添加一个系统调用,实现对指定进程的 nice 值的修改...

    操作系统实验 体验linux基本操作 子进程的创建

    一、实验目的: ... Stones(译者:陈健,宋健建),人民邮电出版社,2010)第11章“进程和信号”的内容,熟悉进程创建、进程协同工作等相关函数如fork()、system()、exec()、waitpid()、exit()等的使用方法。

    Linux 创建子进程执行任务的实现方法

    Linux 操作系统紧紧依赖进程创建来满足用户的需求。例如,只要用户输入一条命令,shell 进程就创建一个新进程,新进程运行 shell 的另一个拷贝并执行用户输入的命令。Linux 系统中通过 fork/vfork 系统调用来创建新...

    Oracle自学(学习)材料 (共18章 偏理论一点)

    1 Oracle 结构组件 目标 1-2 基本结构概述 1-3 Oracle 服务器 1-4 Oracle 实例 1-5 建立连接和创建会话 1-6 Oracle 数据库 1-7 物理结构 1-8 内存结构 1-9 系统全局区(SGA) 1-10 共享池 1-12 库缓存 1-13 数据字典...

    操作系统实验(4).doc

    实验内容 1、编写一段程序,实现软中断通信: 使用系统调用fork( )创建两个子进程,父进程用系统调用kill()向两个子进程分别发送整数值为SIGUSR1和 SIGUSR2软中断信号,子进程获得对应软中断信号后,分别输出下列...

    简单掌握Linux系统中fork()函数创建子进程的用法

    fork()函数只能在类Unix系统下使用,因为需要引入unistd头文件,这里我们就来简单掌握Linux系统中fork()函数创建子进程的用法,需要的朋友可以参考下

    线程的创建与撤销

    它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立线程的句柄。 原型: HANDLE CreateThread(  LPSECURITY_ATTRIBUTES lpThreadAttributes,  DWORD dwStackSize,  LPTHREAD_START_ROUTINE ...

    5种方法得到所有进程名(包括隐藏进程)

    VB使用5种方法得到所有进程名(包括隐藏进程),2000系统下可能不能使用,判断系统版本如果是2K以下的系统就报错退出,获取Debug权限这是必须的。获取常规下的进程,打印进程、判断指定进程是否为隐藏进程……  ...

    操作系统实验

    (l)进程的创建:编写一段程序,使用系统调用fork()创建两个或多个子进程。当此程序运行时,在系统中有一个父进程和其余为子进程在活动。 (2)进程的控制:在程序中使用系统调用lockf()来给每一个进程加锁,实现进程...

    CentOS.5系统管理-part1

    9.1.8 使用文件系统的一般方法 9.2 挂装和卸载文件系统 9.2.1 挂装文件系统 9.2.2 自动挂装文件系统 9.2.3 挂装选项 9.2.4 卸载文件系统 9.3 ext2/ext3文件系统管理 9.3.1 ext2/ext3文件系统管理工具 9.3.2 创建ext2...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--aidl调用系统service未公开的方法挂电话 |--aidl调用系统未公开的方法代码示例2 |--android dp和px之间转换 |--android INSTALL_PARSE_FAILED_MANIFEST_MALFORMED |--android root下禁用组件 |--android 判断网络...

    oracle10g课堂练习I(1)

    服务器进程和数据库缓冲区高速缓存 1-14 物理数据库结构 1-15 表空间和数据文件 1-17 SYSTEM 和 SYSAUX 表空间 1-18 段、区和块 1-19 逻辑和物理数据库结构 1-20 课程示例: HR 方案 1-22 数据库体系结构:...

    python后台进程实例

    创建后台进程对象:使用multiprocessing库的Process()函数创建一个后台进程对象,并将后台进程函数作为参数传递给该函数。 启动后台进程:调用后台进程对象的start()方法来启动后台进程。此时,后台进程将在独立的...

    高级UNIX编程 pdf 电子书

    本书以当前UNIX规范为基础,详细介绍了UNIX系统函数的用法,并用大量的代码和示例程序进行演示,对实际编程具有指导意义。全书共9章,内容包括:基本概念、基本文件I/O、高级文件I/0、终端I/O、进程与线程、基本...

    Oracle DBA workshop1 (中文版)

    服务器进程和数据库缓冲区高速缓存1-14 物理数据库结构1-15 表空间和数据文件1-17 SYSTEM 和SYSAUX 表空间1-18 段、区和块1-19 逻辑和物理数据库结构1-20 课程示例:HR 方案1-22 数据库体系结构:结构化组件概要1-23...

    Linux系统中C语言编程创建函数fork()执行解析

    最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下: 1.函数本身 ... 一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child p

    oracle10g课堂练习I(2)

    服务器进程和数据库缓冲区高速缓存 1-14 物理数据库结构 1-15 表空间和数据文件 1-17 SYSTEM 和 SYSAUX 表空间 1-18 段、区和块 1-19 逻辑和物理数据库结构 1-20 课程示例: HR 方案 1-22 数据库体系结构:...

    UNIX操作系统教程 张红光

    第1章绪论.1 1.1操作系统概述1 1.1.1建立操作系统的目标1 1.1.2操作系统是用户与计算机的接口1 1.1.3操作系统是资源管理器2 1.2UNIX系统的主要特性3 1.3UNIX系统的发展史4 1.4开源软件与UNIX的推广发展6 1.4.1开源...

Global site tag (gtag.js) - Google Analytics