linux 进程的创建
1. 进程号:
每个进程在被初始化的时候,系统都会为其分配一个唯一标识的进程id,称为进程号;
进程号的类型为pid_t,通过getpid()和getppid()可以获取当前进程号和当前进程的父进程的进程号;
2. 进程复制:
fork函数,是以父进程为蓝本复制一个新的子进程,包括复制代码段,数据段,堆栈段等,除了代码段,子进程会有自己的物理内存空间,其中的内容是和父进程的数据段,堆栈段是一样的,当然进程号是不一样;
在linux下,fork函数是用写复制实现的。所谓写复制,只复制父进程的虚拟地址空间(数据结构),子进程并不会产生自己的物理内存空间,直到父进程或者子进程中有对某个段的写行为的时候,再为子进程创建独立的物理内存控制。写复制的目的是为了提供创建进程的效率;
fork函数在父进程中调用一次,返回两次。根据返回值的不同判断是在父进程还是在子进程中执行。父进程返回的是子进程的进程号,子进程返回的是0,如果失败返回-1;
3. system函数:
创建新的进程调用shell命令,并阻塞当前进程直到shell命令执行完成;
不能执行返回127,成功返回进程状态值,失败返回-1;
int ret = system("ping www.baidu.com");
4. exec函数族:
exec函数会创建新的进程,并替换当前进程的资源,因此新的进程号依然和原来的进程号相同;
exec函数在执行以后不会返回,因为新的进程资源已经占据了当前进程的资源,包括代码段,数据段和堆栈段等,只有进程调用失败才返回-1;
exec函数通常会在fork之后,在新的子进程中被调用,这样的话,新的进程会占用子进程的资源进行运行;
linux系统采用写时复制,在fork之后如果立即调用exec函数,不会立即复制父进程的资源,而是使用exec的参数来覆盖原有进程。除非发生了原来的内存内容发生改变时,才创建新的物理内存空间;
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h> int main(int argc, char **arg) {
pid_t pid = getpid();
pid_t ppid = getppid();
printf("linux net: %d %d \n", pid, ppid); pid_t cpid = fork();
int count = ;
if (cpid > ) {
printf("parent progress: %d %d %d. %d \n", cpid, getpid(), getppid(), count);
count = ;
}
else if (cpid == ) {
printf("child progress: %d %d %d. %d \n", cpid, getpid(), getppid(), count);
count = ; int ret = execvp("./net-exe-test", );
printf("exec ret %d \n", ret);
}
else {
printf("create progress failed. \n");
}
printf("---------------------1 pid %d count %d \n", getpid(), count);
getchar(); return ;
}
linux 进程的创建的更多相关文章
- Linux进程的创建函数fork()及其fork内核实现解析【转】
转自:http://www.cnblogs.com/zengyiwen/p/5755193.html 进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程.调用进程为父进 ...
- Linux进程的创建函数fork()及其fork内核实现解析
进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程.调用进程为父进程,被创建的进程为子进程. fork函数的接口定义如下: #include <unistd.h& ...
- linux进程学习-创建新进程
init进程将系统启动后,init将成为此后所有进程的祖先,此后的进程都是直接或间接从init进程“复制”而来.完成该“复制”功能的函数有fork()和clone()等. 一个进程(父进程)调用for ...
- linux进程解析--进程的创建
通常我们在代码中调用fork()来创建一个进程或者调用pthread_create()来创建一个线程,创建一个进程需要为其分配内存资源,文件资源,时间片资源等,在这里来描述一下linux进程的创建过程 ...
- Linux进程-进程的创建
今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的.下面对其作一下简单的总结. 一.Linux进程在内存中的相关资源 很容易理解,Linux进程的创建过程就是内存中进程相关资源产生 ...
- linux进程编程:子进程创建及执行函数简介
linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system(); 下面分别做详细介绍.(1)fork() 函数定 ...
- Linux内核分析第六周学习总结:进程的描述和进程的创建
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 ...
- Linux下进程的创建
这篇文章主要是讲解到Linux进程的控制,包括程序和进程.守护进程.守护进程的出错处理. 1.程序和进程 程序(program)是存放在磁盘文件中的可执行文件,程序的执行实例被称为进程(process ...
- Linux进程创建和结束
在Linux中,进程的创建由系统调用fork和vfork完成.它们生成一个子进程并且子进程是父进程的一个复制品. Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel ...
随机推荐
- linux下c语言实现搜索根目录下所有文件(转-wangxiangshang)
头文件: #include<dirent.h> #include<sys/types.h> opendir(): 函数原型: DIR * opendir(const char* ...
- dict
1.创建新字典(根据语法和dict初始化方法) >>> my_dict={'a':1,'b':2,'c':3} >>> my_dict=dict({'a':1,'b ...
- js/css在html文档中的引用外部文件方式对比
包含css样式表和js脚本的最好方式是使用外部文件,因为css/js和html标记文档可以清晰地分离. css的外部引用写在<head></head>中: <head&g ...
- JavaScript 消息框+特殊字符
JavaScript 中创建三种消息框:警告框.确认框.提示框: 1.警告框: 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作 语法:alert(&qu ...
- 【OPENGL】第二篇 HELLO OPENGL(续)
上一次我们在这里分析了OpenGL的例子,但是最后还少分析最重要的部分:着色器相关的代码.因此这一次作为前一篇文章的续集. 上一篇文章的地址 http://www.cnblogs.com/MyGame ...
- Android应用开发-数据存储和界面展现(二)(重制版)
SQLite数据库 // 自定义类MyOpenHelper继承自SQLiteOpenHelper MyOpenHelper oh = new MyOpenHelper(getContext(), &q ...
- mysql授权登录用户
创建用户并授权 CREATE USER 'voctrals'@'%' IDENTIFIED BY 'some_password'; 允许远程访问 GRANT ALL PRIVILEGES ON *.* ...
- SQL Server Analysis Services SSAS Processing Error Configurations
转载:https://www.mssqltips.com/sqlservertip/3476/sql-server-analysis-services-ssas-processing-error-co ...
- 【Infobright】infobright数据导入导出测试
创建数据库 create database if not exists `mytestdb` default charset=utf8; use mytestdb; 说明: 如果使用utf8字符集,则 ...
- Fastboot模式和Recovery模式
http://blog.csdn.net/luoshengyang/article/details/29688041 在回答第一个问题之前,我们先来看看Android设备从硬件到系统的结构,如图1所示 ...