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 = 1;
    if (cpid > 0) {
         printf("parent progress: %d %d %d. %d \n", cpid, getpid(), getppid(), count);
         count = 111;
    }
    else if (cpid == 0) {
        printf("child progress: %d %d %d. %d \n", cpid, getpid(), getppid(), count);
        count = 222;

        int ret = execvp("./net-exe-test", 0);
        printf("exec ret %d \n", ret);
    }
    else {
        printf("create progress failed. \n");
    }
    printf("---------------------1 pid %d count %d \n", getpid(), count);
    getchar();

    return 0;
}

 

转载于:https://www.cnblogs.com/iRidescent-ZONE/p/6185203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值