Linux c进程管理—创建进程 system、execl、execlp、fork

Linux c 进程管理:
 
1.      创建进程:
       system函数:
        int system(const char*filename);
                                                 建立独立进程,拥有独立的代码空间,内存空间
                                                 等待新的进程执行完毕,system才返回.(阻塞)
         system:创建一个堵塞的新进程,新进程结束后,system才返回
 
         案例:
              使用system调用一个程序。
                    观察进程ID。
                    观察阻塞。
 
代码:
text.c
 
#include<stdio.h>
#include<unistd.h>
 
void  main()
{
      printf(“%d\n”,getpid());    //打印当前进程id
      sleep(10);               //进程睡眠10秒
}
 
gcctext.c –o text
 
system.c
 
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
 
void  main()
{
     printf(“%d\n”,getpid());
     int r=system(“./text”);
     printf(“%d\n”,r);
}
 
gccsystem.c –o main
 
结论:
     新进程的返回值与system返回值有关系。
        任何进程的返回值:不要超过255。一个字节。
        system的返回值中8-15位存放返回码(一个字节存放返回码)
     要想得到返回码,则不能直接用system的返回值,要取返回值的8-15位的内容。
     Linux提供一个宏来获取该值WEXITSTATUS(status)、包含在#include<sys/wait.h>中
 
代码:
 
text.c
 
#include<stdio.h>
#include<unistd.h>
 
int  main()
{
      printf(“%d\n”,getpid());    //打印当前进程id
      sleep(10);             //进程睡眠10秒
      return 99;
}
 
gcctext.c –o text
 
system.c
 
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
 
void  main()
{
     printf(“%d\n”,getpid());
     int r=system(“./text”);
     printf(“%d\n”,WEXITSTATUS(r));
}
 
gccsystem.c –o main
 
 
 
 
 
 
 
popen函数:
   #include<stdio.h>
   函数原型:
   FILE * popen ( constchar * command , const char * type );
int pclose ( FILE * stream );
 
popen:创建子进程
在父子进程之间建立一个管道
command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell将执行这个命令。
type: 只能是读或者写中的一种,得到的返回值(标准I/O 流)也具有和 type 相应的只读或只写类型。如果type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到command 的标准输入。
返回值:
  如果调用成功,则返回一个读或者打开文件的指针,如果失败,返回NULL,具体错误要根据errno判断
  int pclose (FILE*stream)
  参数说明:
  stream:popen返回的文件指针
  返回值:
  如果调用失败,返回 -1
 
案例:
使用popen调用ls -l,并且建立一个管道读取输出
 
#include<stdio.h>
#include<unistd.h>
 
void main()
{
     char buf[1024];
     FILE *f=popen(“ls - l”,”r”);
     int fd=fileno(f);
     int r;
     while((r=read(fd,buf,1024))>0)
     {
            buf[r]=0;
          printf(“%s”,buf);
     }
     close(fd);
     pclose(f);
}
 
execlexecle:
          代替当前进程的代码空间中的代码数据,函数本身不创建新的进程。
 
excel函数:
int execl(const char * path,const char*arg,….);
第一个参数:替换的程序
第二个参数…..:命令行
                      命令行格式:命令名 选项参数
                      命令行结尾必须空字符串结尾
 
案例:
                     使用exec执行一个程序。
                     体会:*是否创建新的进程?没有
                              *体会execl的参数的命令行的格式
                              *体会execl与execlp的区别(execl只当前路径)(不是当前路径必须加绝对路径)
                                                               execlp使用系统的搜索路径
                               *体会execl替换当前进程的代码
 
代码:
 
text.c
 
#include<stdio.h>
#include<unistd.h>
 
void  main()
{
      printf(“%d\n”,getpid());    //打印当前进程id
      sleep(10);             //进程睡眠10秒
   
}
 
gcctext.c –o text
 
 
 
 
exec.c
 
#include<stdio.h>
#include<unistd.h>
 
 
void  main()
{
       printf(“main::%d\n”,getpid());
       int r=excel(“./text”,”text”,NULL);
       //int r=excel(“/bin/ls”,”ls”,”-l”,NULL);
       //int r=excelp(“ls”,”ls”,”-l”,NULL);
       printf(“结束:%d\n”,r);
}
 
总结:
程序运行后,两个打印进程id是一样,则excel和execlp不创建新的进程。
最后的打印结束的语句不能执行,因为excel和excelp是将新的程序的代码替换到该程序的代码空间中了。
两个函数的最后一个参数必须为0或NULL
函数的第一个参数是可执行程序的路径,第二个参数才是执行的命令
 
 
fork函数:
函数原型:
         pid_t  fork(); //1.创建进程
                     //2.新进程的代码是什么:克隆父进程的代码
                                                        而且克隆了执行的位置.(从父进程复制过来的代码,fork之前的代码不会再子进程中执行,子进程只会执行从父进程复制过来的fork以后的代码)
                     //3.在子进程不调用fork所以返回值=0;(pid=0为子进程的)
                                    //4.父子进程同时执行.
 
例子代码:
#include<stdio.h>
#include<unistd.h>
 
void  main()
{
      printf(“创建进程之前\n”);
      int pid=fork();
      printf(“创进程之后%d\n”,pid);
}
 
虽然子进程的代码是克隆父进程的,但我们也可以把子进程要执行的代码和父进程要执行的代码分开。
 
例子:
#include<stdio.h>
#include<unistd.h>
 
voidmain()
{
      printf(“创建进程之前:\n”);
      int pid=fork();
      if(pid==0)
      {
           printf(“子进程:\n”);
      }
      else
      {
           printf(“父进程:\n”);
      }
}

Linux c进程管理—创建进程 system、execl、execlp、fork

时间: 2024-11-08 18:24:52

Linux c进程管理—创建进程 system、execl、execlp、fork的相关文章

linux进程管理(5)---进程消亡

一.目的 本文将讲述进程是如何消亡的.一个进程既有父进程又有子进程,因此进程消亡时,既要通知父进程,也要安排好子进程. 当前进程消亡时主要做了三件大事:释放当前进程占用的资源:为当前进程的子进程重新寻找"养父":通知当前进程的父进程,释放当前进程剩下的资源. 当前进程释放掉大多数进程资源后,只保留内核栈.structtask_struct数据结构:剩下的资源由父进程负责释放. linux调用sys_exit().sys_wait4()实现进程的消亡,代码可以在kernel/exit.c

进程管理(六)-进程的描述

进程管理(六)-进程的描述 进程控制块:进程的PCB 是系统感知进程的唯一实体 程序段:描述进程所要完成的功能 程序操作的数据集:程序在执行时必不可少的工作区和操作对象 PCB PCB是什么 PCB包含有关进程的描述信息.控制信息以及资源信息,是进程动态特征的集中反映. PCB作用 1.系统根据PCB感知进程的存在和通过PCB中所包含的各项变量的变化,掌握进程所处的状态以达到控制进程活动的目的. 2.一个进程的PCB结构都是全部或部分常驻内存的. PCB的生命周期 在创建一个进程时,首先创建其

进程管理(十)-进程通信

进程管理(十)-进程通信 什么是进程通信 通信(communication)意味着在进程间传送数据. 低级通信VS高级通信 控制信息的传送.进程间控制信息的交换称为低级通信. 大批量数据传送.进程间大批量数据的交换称为高级通信. 进程的通信的四种方式 主从式 特点: 1.主进程可自由地使用从进程的资源或数据 2.从进程的动作受主进程的控制 3.主进程和从进程的关系是固定的 例子:主从式通信系统的典型例子是终端控制进程和终端进程 会话式 会话方式中,通信进程双方可分别称为使用进程和服务进程.其中,

进程管理(九)-进程互斥

进程管理(九)-进程互斥 临界区 什么是临界区 不允许多个并发进程交叉执行的一段程序称为临界部分(critical section )或临界区(critical region) 临界区不可能用增加硬件的方法来解决.因此,临界区也可以被称为访问公用数据的那段程序. 为什么要设置临界区 防止进程并发执行的时候,出现冲突,或者由于两个并发进程处于竞争状态,进而导致两者执行顺序不固定,导致程序执行出错. 例子 设计算进程PA,PB共享内存MS. MS分为系统区.进程工作区和数据区.数据区划分成大小相等的

Linux进程管理及进程管理工具的使用

Linux的进程管理 进程:简单来说就是一个运行中的程序的副本,是进程的一个实例,它是有生命周期的 进程的创建:进程都是由其父进程创建的,最开始的进程就是init. 进程优先级:0-139 实时优先级:1-99: 静态优先级:100-139,对于静态来说数字越小优先级越高, 优先级还有一个Nice值,值为-20(对应100),19(对应19),可以通过调整Nice值来调整优先级. 进程分为守护进程和前台进程,守护进程就是在系统引导过程中启动的进程,跟终端无关的进程:前台进程跟终端有关,通过终端启

Linux网络技术管理及进程管理

OSI七层模型和TCP/IP四层模型 OSI七层模型:OSI(Open System Interconnection)开放系统互连参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系. TCP/IP四层模型:TCP/IP参考模型是计算机网络的祖父ARPANET和其后继的因特网使用的参考模型. 分层作用:方便管理 七层模型优点: 1.把复杂的网络划分成为更容易管理的层(将整个庞大而复杂的问题划分为若干个容易处理的小问题) 2.没有一个厂家能完整的提供整套解决方案和所有的

【进程管理】进程(线程)创建

本节主要研究进程(线程)创建的过程,下文将不区分进程和线程: 基本知识 在linux系统中,第一个进程是系统固有的,是由内核的设计者安排好的:一个新的进程一定要由一个已存在的进程复制出来,而不是创造出来的,其实linux系统并不提供直接创建进 程的方法:创建了子进程以后,父进程可以继续走自己的路,与子进程分道扬镳,但是如果子进程先行exit(),那么将要向父进程发一个信号:父进程也可以选择睡眠,等子进程 exit()以后再去世,然后父进程再继续执行,可使用wait3()某个特定的子进程,wait

linux下的进程管理(进程的基本了解及查看pstree,ps,pgrep命令)

Linux下的进程管理 1.什么是进程?程序是静态的文件进程是运行中的程序的一个副本进程存在生命周期(准备期,运行期,终止期)2.进程状态 状态 定义 R(TASK_RUNNING) . 可执行状态(RUNNING,READY)running:正在被处理 ready: 在排队, cpu处理进程个数有限 S(TASK_INTERRUPTIBLE) 可唤醒状态 :在cpu上使用的时间超时,此时被打入休眠状态,随着程序的调用会被唤醒 D(TASK_UNINTERRUPTIBLE) 不可唤醒状态 T(T

linux进程管理之进程查看

查看进程 process ====================================================================================了解如进程的:• PID,PPID• 当前的进程状态• 内存的分配情况• CPU和已花费的实际时间• 用户UID,它决定进程的特权 w 查看当前系统信息 [root@bogon cron]# w14:48:39 up 2:46, 1 user, load average: 0.00, 0.01, 0.00