[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才告终止. ...
随机推荐
- java—数据存储过程 (54)
存储过程:procedure:就是一段可执行程序.这个程序运行在数据中. Begin = { End = } If Else 也可以接收参数. 1 定义一个procedure: CREATE PROC ...
- sublime package control失败
https://blog.csdn.net/jyfu2_12/article/details/86667132 安装时的错误提示如下: Error installing Package Control ...
- linux中文件句柄数问题
问题描述: 有时候业务比较繁忙时,就会出现如下问题 too many open files:顾名思义即打开过多文件数.不过这里的files不单是文件的意思,也包括打开的通讯链接(比如sock ...
- 爬虫7:selenium
1. 一个简单的使用例子 from selenium import webdriver from selenium.webdriver.common.by import By from seleniu ...
- js根据经纬度计算两点距离
js版-胡老师 google.maps.LatLng.prototype.distanceFrom = function(latlng) { var lat = [this.lat(), lat ...
- NPOI设置水平、垂直居中
C#语法: string fs = "@report.xls";//文件路径 FileStream excelPath = File.Open(@fs, FileMode.Open ...
- C# 聊一聊屏保的设置
初步认识屏保 进入屏保设置 强行开头,大家都知道我们只需要在搜索框打入“屏保”,就能进入屏保的设置选项.然而箭头指向的位置到底是在Windows的哪个地方呢?这就是写这篇博客的原因. 进入一个屏幕保护 ...
- (转)sysbench部署与参数详解
sysbench部署 原文:https://wing324.github.io/2017/02/07/sysbench%E9%83%A8%E7%BD%B2/ sysbench作为每一个系统管理员,都应 ...
- Windows Server 2003、2008、2012系统的安装
说在前面的话 Windows Server 2003,和Windows XP十分相似,可以简单地认为Windows Server 2003是在Windows XP的基础上多了一些服务器管理和操作的功能 ...
- maven的安装配置超详细教程【含nexus】
1 下载 下载地址:http://maven.apache.org/download.cgi 界面效果如下: 点击之后进入的apache 软件基金的发布目录,在这里你可以下载apache的所有项目. ...