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 进程的创建的更多相关文章

  1. Linux进程的创建函数fork()及其fork内核实现解析【转】

    转自:http://www.cnblogs.com/zengyiwen/p/5755193.html 进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程.调用进程为父进 ...

  2. Linux进程的创建函数fork()及其fork内核实现解析

    进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程.调用进程为父进程,被创建的进程为子进程. fork函数的接口定义如下: #include <unistd.h& ...

  3. linux进程学习-创建新进程

    init进程将系统启动后,init将成为此后所有进程的祖先,此后的进程都是直接或间接从init进程“复制”而来.完成该“复制”功能的函数有fork()和clone()等. 一个进程(父进程)调用for ...

  4. linux进程解析--进程的创建

    通常我们在代码中调用fork()来创建一个进程或者调用pthread_create()来创建一个线程,创建一个进程需要为其分配内存资源,文件资源,时间片资源等,在这里来描述一下linux进程的创建过程 ...

  5. Linux进程-进程的创建

    今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的.下面对其作一下简单的总结. 一.Linux进程在内存中的相关资源   很容易理解,Linux进程的创建过程就是内存中进程相关资源产生 ...

  6. linux进程编程:子进程创建及执行函数简介

    linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system();    下面分别做详细介绍.(1)fork()    函数定 ...

  7. Linux内核分析第六周学习总结:进程的描述和进程的创建

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 ...

  8. Linux下进程的创建

    这篇文章主要是讲解到Linux进程的控制,包括程序和进程.守护进程.守护进程的出错处理. 1.程序和进程 程序(program)是存放在磁盘文件中的可执行文件,程序的执行实例被称为进程(process ...

  9. Linux进程创建和结束

    在Linux中,进程的创建由系统调用fork和vfork完成.它们生成一个子进程并且子进程是父进程的一个复制品. Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel ...

随机推荐

  1. 解决嵌入式linux系统下iconv库的移植问题

    一.解决问题    在arm开发板上使用framebuff,在汉字显示时,因为只有gb2312的16*16的汉字字库,而ubuntu16.04默认    的编码方式时utf-8,因此需要进行转码(ut ...

  2. DNS学习笔记之DNS理论知识

    DNS: Domain Name System (将域名和ip地址相互转化) 域名是一个范围,例如baidu.com,.com.而www.baidu.com是个主机名,即FQDN: Full Qual ...

  3. yum常用命令

    Yum list kmod-coretemp[查找kmod-coretemp模块状态] Yum clean all[清空yum缓存] Yum remove kmod-coretemp [卸载kmod- ...

  4. LEETCODE —— Linked List Cycle [Floyd's cycle-finding algorithm]

    Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it ...

  5. js中java式的类成员

    function Range(from,to,x){ //实例(对象)字段 this.x=x; } //类字段 Range.Y="类字段"; //类方法 Range.s=funct ...

  6. CentOS 6、7下pptp vpn一键安装脚本

    之前有折腾过<CentOS 6.7下IPSEC/L2TP VPN一键安装脚本>,不稳定.不支持IOS,因此换成pptp,并已经添加到<lnmp一键安装包>.这个脚本可以单独使用 ...

  7. python3.5学习笔记--利用字典对指定文本字符串进行替换

    事情缘起于同事整理excel,需要批量的对某一列的内容进行替换. 举例: 数据格式:以下为一列内容,每行都在一个单元格中,目的是将数字替换为制定的中文字符. 1,2,31 ,4,33 ,21,, 对于 ...

  8. SQL2005语句实现行转列,列转行

    在做报表时,经常需要将数据表中的行转列,或者列转行,如果不知道方法,你会觉得通过SQL语句来实现非常难.这里,我将使用pivot和unpivot来实现看似复杂的功能.这个功能在sql2005及以上版本 ...

  9. HDU3068 最长回文串

    题目大意:给出一个字符串,求其回文串的长度.有多组数据. 分析:manacher算法模板题. //在原字符串两边和中间插入一个从未出现的字符,比如‘#’.然后再在最前面插入一个‘*’.#include ...

  10. Bandpass Signals(带通信号,或称窄带信号)

    带通信号 一个实的带通信号$x(t)$可以表示为 \[x(t) = r(t)\cos (2\pi f_0 t + \phi_x(t)) \] 其中$r(t)$是幅度调制或包络,$\phi_x(t)$是 ...