[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==){
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>){
pid=getpid();
ppid=getppid();
printf("我是父进程,pid=%d , ppid=%d ,我新建的子进程pid=%d\n",pi
d,ppid,ret);
sleep();//父进程不能太快终止,否则看不出子进程ppid的效果
}else if(ret==){
pid=getpid();
ppid=getppid();
printf("我是子进程,pid=%d , ppid=%d \n",pid,ppid);
}else if(ret==-){
perror("fork");
}
}
我是父进程,pid=13890 , ppid=10038 ,我新建的子进程pid=13891
我是子进程,pid=13891 , ppid=13890
[Linux]C语言Linux系统编程创建进程的更多相关文章
- C语言嵌入式系统编程修炼
C语言嵌入式系统编程修炼 2008-08-19 作者:宋宝华 来源:天极网 C语言嵌入式系统编程修炼之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程 ...
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
- Linux系统编程之进程控制(进程创建、终止、等待及替换)
进程创建 在上一节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建一个新进程.那么,系统是如何创建一个新进程的呢?这就需要我们更深入的剖析fork函数. 1.1 fork函数的返回值 调用 ...
- linux服务器开发二(系统编程)--进程相关
进程相关的概念 程序与进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(CPU.内存.打开的文件.设备.锁等等). 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...
- Linux系统编程——Daemon进程
目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制 ...
- linux系统编程之进程(五)
今天继续学习系统编程,学习的主题还是进程,今天主要讨论的是守护进程相关的概念,开始进入正题: 什么是守护进程: 守护进程的创建步骤: 在描述它之前,首先得先了解两个概念:进程组.会话期: ...
- linux系统编程之进程(一)
今天起,开始学习linux系统编程中的另一个新的知识点----进程,在学习进程之前,有很多关于进程的概念需要了解,但是,概念是很枯燥的,也是让人很容易迷糊的,所以,先抛开这些抽象的概念,以实际编码来熟 ...
- linux系统编程之进程(二):进程生命周期与PCB(进程控制块)
本节目标: 进程状态变迁 进程控制块 进程创建 进程撤消 终止进程的五种方法 一,进程状态变迁 进程的三种基本状态 就绪(Ready)状态 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便 ...
- linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid
本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...
随机推荐
- python网络编程--TCP连接的三次握手(三报文握手)与四次挥手
一.TCP连接 运输连接有三个阶段: 连接建立.数据传送和连接释放. 在TCP连接建立过程中要解决以下三个问题: 1,要使每一方能够确知对方的存在. 2.要允许双方协商一些参数(如最大窗口之,是否使用 ...
- 阿里云ros实例
模板文件 { "ROSTemplateFormatVersion": "2015-09-01", "Parameters": { " ...
- jquery scrollTop()与scrollLeft()
1.scrollLeft() scrollLeft() 方法设置或返回被选元素的水平滚动条位置. 提示:当滚动条位于最左侧时,位置是 0. 当用于返回位置时:该方法返回第一个匹配元素的滚动条的水平位置 ...
- python 全栈开发:基础复习
格式化输出: username = 'python' password = 'python1' print(''' username:%s password:%s '''%(username,pass ...
- 使用nginx+uwsgi+Django环境部署
环境准备 Python点这里 nginx点这里 uwsgi点这里
- Q72 编辑距离
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输 ...
- Springboot用官方建议访问Html页面并接传值
Springboot用官方建议访问Html页面并接传值 我们以前通常习惯用webapp来防止jsp页面,但是到了Springboot中,官方建议用Static文件夹来存放及静态的资源, 用templa ...
- codeblocks中文编码问题
其实这是老调重弹的问题了,在windows下面出现中文乱码大多都是编码格式的问题不一致的问题,最简单的就是uft-8和gbk冲突的问题.如果一个文件本来是以utf-8存的,但是以gbk打开,当然会出现 ...
- android 签名验证防止重打包
网上资料很多,这里只做一个笔记反编译 dex 修改重新打包签名后 apk 的签名信息肯定会改变,所以可以在代码中判断签名信息是否被改变过,如果签名不一致就退出程序,以防止 apk 被重新打包. 1 j ...
- 翻译:WebAssembly简介:我们为什么要关心这个技术?
原文: https://tomassetti.me/introduction-to-webassembly/ WebAssembly简介:我们为什么要关心这个技术? 在对抗js的伟大战斗中有 ...