进程创建

普通函数调用完成后,最多返回(return)一次,但fork/vfork会返回二次,一次返回给父进程,一次返回给子进程

父进程的返回值为子进程的进程ID,子进程的返回值为0

1.pid_t fork(void)

父子进程共享代码段,fork之后子进程获得父进程数据空间、堆和栈的副本,然后各自独立操作自己的数据,但他们共享文件描述符

2.pid_t vfork(void)

父子进程共享资源不分家;子进程比父进程先运行,子进程结束后再运行父进程,像普通的函数调用一样

进程同步

1.pid_t wait(int *statloc)

由父进程调用,阻塞式等待任一子进程结束

2.pid_t waitpid(pid_t pid, int *statloc, int options)

可以选择等待指定子进程结束,可设置成非阻塞式等待

调用外部程序

1.exec函数家庭

exec函数族不创建新进程,只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆和栈段

特别注意的是exec执行成功时不返回(就是不再执行exec下面的语句),在载入的程序执行完后就退出了

2.int system(char *cmdstring) 系统调用

system适合拿来调用系统内置的命令或shell脚本

进程优先级

1.int nice(int incr)

主动降低使用cpu的频率

2.int getpriority(int which, id_t who)

获取nice值

3.int setpriority(int which, id_t who, int value);

可以为进程、进程组和特定用户的所有进程设置优先级

进程终止

1.正常终止

  • 从main返回:return 0,关闭io流等资源文件
  • exit:同return 0
  • _exit:仅将自身设置成不可运行,由父进程调用wait/waitpid进行资源回收

2.异常终止

  • abort:因特殊情况主动终止
  • 由一个信号终止:被其它程序kill或运行期间产生错误(越界内存访问/除零等)被系统中止

例子

1.wait/waitpid/fork基本用法

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h> int main(){
pid_t pid;
if((pid=fork()) <0){
perror("fork error");
return -1;
}else if(pid==0){
if(system("ls -l")<0){
puts("system error");
_exit(-1);
}
_exit(0);
} if(waitpid(pid,NULL,0) != pid)
puts("wait error"); if((pid=fork()) <0){
perror("fork error");
return -1;
}else if(pid==0){
execlp("date","date",(char *)0);
puts("if execlp goes wrong,you will see me!");
_exit(-1);
} if(wait(NULL)<0)
puts("wait error"); return 0;
}

2.退出状态

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h> void pr_exit(int status){
if(WIFEXITED(status))
printf("normal exit, exit status=%d\n",WEXITSTATUS(status));
else if(WIFSIGNALED(status))
printf("abnormal exit, signal number=%d\n",WTERMSIG(status));
else if(WIFSTOPPED(status))
printf("child stoped, signal number=%d\n",WSTOPSIG(status));
else
printf("unknown exit\n");
} int main(){
pid_t pid;
int status;
//_exit
if((pid=fork())<0){
perror("fork error");
return -1;
}else if(pid==0)
_exit(7); if(wait(&status) != pid){
perror("wait error");
return -1;
}
pr_exit(status);
//abort
if((pid=fork())<0){
perror("fork error");
return -1;
}else if(pid==0)
abort(); if(wait(&status) != pid){
perror("wait error");
return -1;
}
pr_exit(status);
//divide by 0
if((pid=fork())<0){
perror("fork error");
return -1;
}else if(pid==0)
status /=0; if(wait(&status) != pid){
perror("wait error");
return -1;
}
pr_exit(status); return 0;
}

linux 进程控制笔记的更多相关文章

  1. linux进程学习笔记

    学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...

  2. Linux进程控制(二)

    1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h&g ...

  3. Linux进程控制(一)

    1. Linux进程概述 进程是一个程序一次执行的过程,它和程序有本质区别.程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度 ...

  4. Linux 进程管理 笔记

    https://www.ibm.com/developerworks/cn/linux/l-linux-process-management/index.htmlLinux 进程管理剖析 进程可以是短 ...

  5. Linux - 进程控制 代码(C)

    进程控制 代码(C) 本文地址:http://blog.csdn.net/caroline_wendy 输出进程ID.getpid(). 代码: /*By C.L.Wang * Eclipse CDT ...

  6. linux 进程学习笔记-运行新进程

    我们知道,当用fork启动一个新进程以后,新进程会复制父进程的大部份内存空间并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一个程序集中的代码,这就相当于启动了一个新程序. ...

  7. Linux 进程控制

    分享知乎上看到的一句话,共勉: 学习周期分为学习,思考,实践,校正四个阶段,周期越短,学习效率越高. 前面讲的都是操作系统如何管理进程,接下来,看看用户如何进行进程控制. 1.进程创建 先介绍一下函数 ...

  8. Linux进程控制(三)

    1. 进程间打开文件的继承 1.1. 用fork继承打开的文件 fork以后的子进程自动继承了父进程的打开的文件,继承以后,父进程关闭打开的文件不会对子进程造成影响. 示例: #include < ...

  9. Linux进程控制——exec函数族

    原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是 ...

随机推荐

  1. MongoDB - The mongo Shell, Data Types in the mongo Shell

    MongoDB BSON provides support for additional data types than JSON. Drivers provide native support fo ...

  2. 手把手教你认识并搭建Nginx

    手把手教你认识并搭建Nginx Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor ...

  3. arcsde service(esri_sde)服务启动后又停止

    由于最近几天我们公司换了新办公楼,各种服务器得重新配置.当我试图直接将arcsde Service的服务器IP改为现在的地址,就报上面如题的错误. SQL服务器是好的,不用管它,只要确保它是开启的.只 ...

  4. ViewSwitcher用法浅析

    如果理解了ViewPager的使用方法,使用ViewSwitcher就方便多了.和ViewFlipper一样,ViewSwitcher也是ViewAnimator的子类,并且只能包含两个子视图,每次展 ...

  5. android sdk manager 无法更新

    1.在C:\Windows\System32\drivers\etc找到Hosts文件用记事本打开,在最末尾添加如下代码,保存关闭: #Google主页203.208.46.146 www.googl ...

  6. IE6的position:fixed

    手头一个项目中,要实现把一个浮层控制在浏览器窗口右下角,用”position:fixed”来控制最合适不过了. 但万恶的IE6不支持这个属性,之前采用过的方法有:将滚动条转移到body上,使用绝对定位 ...

  7. JavaScript学习笔记 - 进阶篇(1)- JS基础语法

    前言 JavaScript能做什么? 1.增强页面动态效果(如:下拉菜单.图片轮播.信息滚动等) 2.实现页面与用户之间的实时.动态交互(如:用户注册.登陆验证等) JS进阶篇学习什么? 在JavaS ...

  8. php验证字符串是否以逗号隔开包括中文字符串

    if(preg_match('/^[\x{4e00}-\x{9fa5}\w]+(,[\x{4e00}-\x{9fa5}\w]+)*$/u','体育,娱乐')){ echo 'ok';}

  9. CSS伪对象选择符整理

    1.E::selection 2.E::placeholder 1. E::selection 设置对象被选择时的样式. 需要注意的是,::selection只能定义被选择时的background-c ...

  10. String中重要方法与字段

    下列这段代码已全部包含了我要写的String类中重要的字段: //StringMisc.java// This program demonstrates the length, charAt and ...