• [Linux]C语言Linux系统编程创建进程


    1.进程ID

    每一个进程都由一个唯一的标识符表示,即进程ID,简称pid.系统保证在某时刻每个pid都是唯一的。

    1.1分配进程ID

    缺省情况下,内核将进程ID的最大值限制为32768,可以在此处设置/proc/sys/kernel/pid_max,在短时间内,内核不会重用已经分配的ID.

    2.获得进程id和父进程id

      #include <stdio.h>
      #include <sys/types.h>
      #include <unistd.h>
      int main(){
              int pid=getpid();
              int ppid=getppid();
              printf("pid:%d ppid:%d 
    ",pid,ppid);
      }

    3.运行新进程

    首先创建新的进程fork()

    在新的进程中执行程序exec系列的系统调用

    4.exec系列的系统调用

    execl()函数的原型为 int execl(const char *path,const char *arg,...)

    path是程序路径,arg是传递给指定程序的可变长度参数列表,最后必须是null结尾

    const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据。

    通常情况下execl()不会返回结果,成功的调用会以跳到新的程序的入口点作为结束,错误的时候会返回-1

             int ret;
             ret=execl("/usr/bin/vim","vim","text.txt",NULL);
             if(ret==1){
                     printf("execl error");
             }

    5.fork()系统调用

    创建一个和当前进程映像一样的进程可以通过fork()系统调用,调用者从fork()返回后,仍然继续运行。

    当前进程就是父进程,创建成功的进程是子进程。

    在父进程成功的fork()调用,会返回子进程的pid

    在子进程fork()调用会返回0

    #include <stdio.h>
    #include <unistd.h>
    int main(){
            int pid,ppid;
    
            int ret=fork();
            if(ret>0){
                    pid=getpid();
                    ppid=getppid();
                    printf("我是父进程,pid=%d , ppid=%d ,我新建的子进程pid=%d
    ",pi
    d,ppid,ret);
                    sleep(3);//父进程不能太快终止,否则看不出子进程ppid的效果
            }else if(ret==0){
                    pid=getpid();
                    ppid=getppid();
                    printf("我是子进程,pid=%d , ppid=%d 
    ",pid,ppid);
            }else if(ret==-1){
                    perror("fork");
            }   
    }

    我是父进程,pid=13890 , ppid=10038 ,我新建的子进程pid=13891

    我是子进程,pid=13891 , ppid=13890 

  • 相关阅读:
    冒泡排序
    快速排序
    玩转git版本控制软件
    django内容总结
    ajax图片上传功能
    随机验证码
    制作博客系统
    django自带的用户认证和form表单功能
    COOKIE 与 SESSION
    Ajax知识
  • 原文地址:https://www.cnblogs.com/taoshihan/p/7954753.html
Copyright © 2020-2023  润新知