Linux进程控制编程

一、获取ID

#include<sys/types.h>

#include<unistd.h>

pid_t getpid(void)    获取本进程ID

pid_t getppid(void)  获取父进程ID

父进程:现有进程中,创建新的进程。

例:getpid.c

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

int main()

{

  printf("PID=%d\n",getpid());

  printf("PPID=%d\n",getppid());

  return 0;

}

二、进程创建  -fork

#include<unistd.h>

pid_t fork(void)

功能:创建子进程

fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:

1、在父进程中,fork返回新创建的子进程的PID.

2、在子进程中,fork返回0。

3、如果出现错误,fork返回一个负值。

例一如:fork1.c

#include<sys/types.h>

#include<unistd.h>

int main()

{

  pid_t pid;

  /*此时仅有一个进程*/

  pid=fork();

  /*此时已经有两个进程在同时运行*/

  if(pid<0)

    printf("error in fork!");

  else if(pid==0)

    printf("I am the child process,ID is %d\n",getpid());

  else

    printf("I am the parent process, ID is %d\n",getpid());

  return 0;

}

例二如:

#include<unistd.h>

#include<stdio.h>

int main()

{

pid_t pid;

int count=0;

pid=fork();

count++;

printf(“count=%d\n”,count);

  return 0;

}

执行结果:

总结:创建子进程后,父子进程共享代码,但数据部分(数据空间、堆栈空间),拷贝。各自操作。

三、进程创建-vfork

#include<sys/types.h>

#include<unistd.h>

pid_t vfork(void)

功能:创建子进程

注:fork与vfork的区别:

1、fork:子进程拷贝父进程的数据段。

vfork:子进程和父进程共享数据段。

2、fork:父、子进程的执行次序不确定。

vfork:子进程先运行,父进程后运行。

四、exec函数族

exec用被执行的程序替换调用它的程序。

区别:

fork创建一个新的进程,产生一个新的PID。

exec启动一个新程序,替换原有的进程,因此PID不会变。

常见函数:

1、int execl(const char* path,const char* arg1,...)

参数:

path:被执行程序名(含完整路径)

arg1-argn:被执行程序所需的命令行参数,含程序名。以空指针(NULL)结束。

#include<unistd.h>

main()

{

  execl("/bin/ls","ls","-al","/etc/passwd",NULL);

}

2、int execlp(const char* path,const char* arg1,...)

参数:

path:被执行程序名(不含路径,将从path环境变量中查找该程序)

arg1-argn:被执行程序所需的命令行参数,含程序名。以空指针(NULL)结束。

#include<unistd.h>

main()

{

  execl("ls","ls","-al","/etc/passwd",(char*)0);

}

执行结果:

3、execv

int execv(const char* path,char* const argv[])

参数:path被执行程序名(含完整路径)。

argv[ ]:被执行程序所需的命令行参数数组。

例如:execvc

#include<unistd.h>

int main()

{

char* argv[]={"ls","-al","/etc/passwd",(char*)0};

execv("/bin/ls",argv);

return 0;

}

4、system

#include <stdlib.h>

int system(const char* string)

功能:调用fork产生子进程,由子进程来调用/bin/sh -c string来执行参数string所代表的命令。

例:system.c

#include<stdio.h>

void main()

{

  system("ls -al /etc/passwd");

}

区别:system是在子进程中调用执行。即,该语句后的语句还可以执行。

exec函数族是将该进程替换执行。即,该语句后的语句不能被执行。

五、进程等待

#include<sys/types.h>

#include<sys/wait.h>

pid_t wait(int* status)

功能:阻塞该进程,直到其某个子进程退出。

例子:wait.c

#include<stdio.h>

#include<sys/wait.h>

void main()

{

  pid_t pc,pr;

  pc=fork();

  if(pc==0)/*如果是子进程*/

  {

    printf("I am child process:%d\n",getpid());

    sleep(10);/*睡眠10秒钟*/

  }

  else if(pc>0){/*如果是父进程*/

    pr=wait(NULL);/*等待*/

    printf("I am child process,and I catched a child process:%d\n",pr);

  }

  exit(0);

}

执行结果:

Linux进程控制编程,布布扣,bubuko.com

时间: 2024-10-26 11:35:03

Linux进程控制编程的相关文章

小何讲进程: Linux进程控制编程 (fork、vfork)

所谓进程控制,就是系统使用一些具有特定功能的程序段来创建进程.撤消进程以及完成进程在各种状态之间的转换, 从而达到多进程高效率并发执行和协调资源共享的目的.进程控制是进程管理和处理机管理的一个重要任务. 1. fork()创建进程 在Linux系统中,除了系统启动之后的第一个进程(根进程)由系统来创建外, 其余所有进程都必须由已存在的进程来创建新创建的进程叫子进程,而创建子进程的进程叫父进程, 具有相同父进程的进程叫兄弟进程. 在Linux中创建一个新进程的方法是使用fork()函数. fork

Linux进程控制——exec函数族

原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char

Linux进程控制程序设计

一.进程控制理论基础 进程:是一个具有一定独立功能的程序的一次运行活动.程序是静态的,程序在运行的时候是进程. 1.进程的特点: 动态性:区别于程序的显著特性 并发性:多个进程可以同时执行 独立性:独立的 异步性:进程与进程之间可以进行异步操作 2.进程三态: 进程的ID(PID):标志进程的唯一数字. 父进程ID(PPID) 启动进程的用户ID(UID) 3.进程互斥 进程互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其他要使用该资源的进程必须等待,直到占用该资源者

Linux进程控制知识总结

目录 一:进程标识符(ID) 二:进程操作 2.1创建一个进程 2.2 fork函数出错情况 2.3创建一个共享空间的子进程 2.4退出程序 2.5设置进程所有者 三:执行程序 3.1 exec函数 3.2 执行解释器文件 3.3在程序中执行Shell命令 四:关系操作符 4.1等待进程退出 4.2 等待指定的进程 进程控制 -- 一步 一:进程标识符(ID) 进程ID是用来标识进程的编号,就像身份证一样.不同的进程有不同的ID,可以通过ID来查询进程.进程标识符的类型是pit_t,其本质是一个

六、Linux进程控制

1. Linux进程概述 进程是一个程序一次执行的过程,它和程序有本质区别. 程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度和消亡的过程,是Linux的基本调度单位. 那么从系统的角度看如何描述并表示它的变化呢?在这里,是通过进程控制块(PCB)来描述的.进程控制块包含了进程的描述信息.控制信息以及资源信息,它是进程的一个静态描述. 内核使用进程来控制对CPU和其他系统资源的访问,并且使用进程来决定在CPU上运行哪个程

Linux进程控制(三)

1. 进程间打开文件的继承 1.1. 用fork继承打开的文件 fork以后的子进程自动继承了父进程的打开的文件,继承以后,父进程关闭打开的文件不会对子进程造成影响. 示例: #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> int main() { char szBuf[32] = {'\0

Linux进程控制(二)

1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h> int system(const char *string); system函数通过调用shell程序/bin/sh –c来执行string所指定的命令,该函数在内部是通过调用execve("/bin/sh",..)函数来实现的.通过system创建子进程后,原进程和子进程各自运行,

Linux进程控制(一)

1. Linux进程概述 进程是一个程序一次执行的过程,它和程序有本质区别.程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度和消亡的过程,是Linux的基本调度单位.那么从系统的角度看如何描述并表示它的变化呢?在这里,是通过进程控制块(PCB)来描述的.进程控制块包含了进程的描述信息.控制信息以及资源信息,它是进程的一个静态描述. 内核使用进程来控制对CPU和其他系统资源的访问,并且使用进程来决定在CPU上运行哪个程序,

【转载】linux进程控制-exec系列 exec系统调用

inux进程控制-exec系列 说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h>int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ...,