专栏首页陶士涵的菜地[Linux]C语言Linux系统编程创建进程

[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 \n",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\n",pi
d,ppid,ret);
                sleep(3);//父进程不能太快终止,否则看不出子进程ppid的效果
        }else if(ret==0){
                pid=getpid();
                ppid=getppid();
                printf("我是子进程,pid=%d , ppid=%d \n",pid,ppid);
        }else if(ret==-1){
                perror("fork");
        }   
}

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [linux] C语言Linux系统编程-捕获进程信号

    sighandler_t signal(int signum, sighandler_t handler);

    陶士涵
  • [linux] C语言Linux系统编程-做成守护进程

    2.在新守护进程的父进程中,调用exit(),为了守护进程的爷爷进程确认父进程结束

    陶士涵
  • [linux] C语言Linux系统编程进程基本概念

    1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件。进程是执行中的目标代码:活动的、生存的、运行的程序。

    陶士涵
  • [linux] C语言Linux系统编程-socket开发

    4.将内存中字节的编号称为地址(Address)或指针(Pointer),一般认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地...

    陶士涵
  • [编程] C语言Linux系统编程-等待终止的子进程(僵死进程)

    如果一个子进程在父进程之前结束,内核会把子进程设置为一个特殊的状态,处于这种状态的进程称为僵死进程

    陶士涵
  • [linux] C语言Linux系统编程-socket回声客户端

    1.所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。

    陶士涵
  • Linux——Linux系统编程之进程(进程id、执行新程序exec、fork创建新进程、exit终止进程)

    进程在Linux中是比较重要的概念,嵌入式Linux和嵌入式单片机是完全不同的,前者基于操作系统,主要是围绕软件的,要实现多任务是很容易实现的,但是在单片机上就...

    Winter_world
  • Linux——Linux系统编程之搭建最小Linux系统

    当前阶段的目标是搞定嵌入式Linux,首先要从Linux系统编程入手,熟悉Linux的编程思想及相关API的使用(文件的操作、进程、内部通信、进程间通信、网络通...

    Winter_world
  • 【Linux笔记】Linux下编译C语言程序

    在上一篇笔记中有分享Linux下的vi/vim编辑器的使用方法(【Linux笔记】Vi/Vim编辑器),现在我们就可以使用vi/vim编辑器编写C代码了。那么写...

    正念君

扫码关注云+社区

领取腾讯云代金券