day28_进程概念、子进程
来源:互联网 发布:云南广电网络网上缴费 编辑:程序博客网 时间:2024/05/20 10:20
进程 - 进程概念和创建子进程fork()
新建目录 - mkdir()
删除空目录 - remdir() remove()
目录切换 - chdir()
更改目录名 - rename()
查看目录 - opendir() 打开一个目录获得目录的指针
readir() 读一个目录的子项
rewinddir() 目录的指针回到开始
获取当前目录的绝对路径(不打印) getcwd()
进程
进程就是运行起来的程序,内存空间分为6种
查看进程的命令:
ps -ef Unix/Linux都支持
ps -aux Linux直接支持,Unix不直接支持
但使用 /usr/ucb/ps 支持,whereis 可以找到
进程常见状态:
S 休眠状态,大多数进程都是处于休眠状态
R 运行状态,正在运行的进程
O 可运行状态
Z 僵尸进程(已结束但资源没有回收的进程)
1.进程的父子关系
如果a进程启动了b进程,a进程叫b进程的父进程,b进程就是a进程的子进程
进程0是Unix/Linux的根进程,其它进程都是由0进程的子进程1(init进程)或子进程2 启动
1.1 父进程创建子进程之后,父子进程同时运行,如果子进程先结束,子进程会给父进程发信号,父进程负责回收子进程的资源
1.2 父进程创建子进程之后,父子进程同时运行,如果父进程先结束,子进程变成孤儿进程,孤儿进程认init进程(1)做新的父进程,init进程也成为孤儿院
1.3 父进程创建子进程之后,父子进程同时运行,如果子进程先结束,而父进程没有收到子进程的信号,子进程变成 僵尸进程
2.进程在Unix/Linux中,进程ID(PID)是唯一标识,getpid()可以获取当前进程的pid,getppid()可以获得父进程PID
进程ID同一时刻不能重复,但可以延迟重用
getuid(),geteuid() - 取当前的有效用户
3.创建子进程的方式:
3.1 fork() 通过复制父进程 创建子进程
3.2 vfork() + exec系列函数 创建全新的子进程
fork() 非常简单的复杂函数
pid_t fork(void);
fork()在创建子进程时,复制父进程的除代码区之外的内存区域,和父进程 完全共享代码区
fork()创建子进程后,fork()之前的代码只有父进程执行一次,fork()之后的代码父子进程都执行一次(一共执行二次) fork()函数会返回2次,父进程返回 子进程pid ,子进程返回 0
fork()创建子进程后,规范中没有确定谁先运行,父子进程谁先运行和操作系统自身的算法有关,Linux中 父子进程谁先运行是不确定的
fork()创建子进程,如果父进程有文件描述符,子进程将复制文件描述符,但不复制文件表
-----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
pid_t pid = fork();//先open后fork,两个文件表
int fd = open("a.txt",O_RDWR|O_CREAT,0666);
if(fd == -1) perror("open"),exit(-1);
//pid_t pid = fork();//先fork后open,一个文件表
if(pid == 0)
{
write(fd,"abc",3);
close(fd);
exit(0);
}
sleep(1);
write(fd,"123",3);
close(fd);
}
-----------------------------------------------------------
练习: 测试父子进程的结束关系 - 孤儿进程
思路:先打印 子进程的父进程,然后子进程sleep(),父进程在sleep()期间结束,子进程sleep()结束后 再次打印父进程
作业:
写一个 ls -ial 效果的命令,属主和属组用ID即可,文件显示 具体信息(stat()),目录显示 当前文件目录下的所有子项目(不需要递归)
新建目录 - mkdir()
删除空目录 - remdir() remove()
目录切换 - chdir()
更改目录名 - rename()
查看目录 - opendir() 打开一个目录获得目录的指针
readir() 读一个目录的子项
rewinddir() 目录的指针回到开始
获取当前目录的绝对路径(不打印) getcwd()
进程
进程就是运行起来的程序,内存空间分为6种
查看进程的命令:
ps -ef Unix/Linux都支持
ps -aux Linux直接支持,Unix不直接支持
但使用 /usr/ucb/ps 支持,whereis 可以找到
进程常见状态:
S 休眠状态,大多数进程都是处于休眠状态
R 运行状态,正在运行的进程
O 可运行状态
Z 僵尸进程(已结束但资源没有回收的进程)
1.进程的父子关系
如果a进程启动了b进程,a进程叫b进程的父进程,b进程就是a进程的子进程
进程0是Unix/Linux的根进程,其它进程都是由0进程的子进程1(init进程)或子进程2 启动
1.1 父进程创建子进程之后,父子进程同时运行,如果子进程先结束,子进程会给父进程发信号,父进程负责回收子进程的资源
1.2 父进程创建子进程之后,父子进程同时运行,如果父进程先结束,子进程变成孤儿进程,孤儿进程认init进程(1)做新的父进程,init进程也成为孤儿院
1.3 父进程创建子进程之后,父子进程同时运行,如果子进程先结束,而父进程没有收到子进程的信号,子进程变成 僵尸进程
2.进程在Unix/Linux中,进程ID(PID)是唯一标识,getpid()可以获取当前进程的pid,getppid()可以获得父进程PID
进程ID同一时刻不能重复,但可以延迟重用
getuid(),geteuid() - 取当前的有效用户
3.创建子进程的方式:
3.1 fork() 通过复制父进程 创建子进程
3.2 vfork() + exec系列函数 创建全新的子进程
fork() 非常简单的复杂函数
pid_t fork(void);
fork()在创建子进程时,复制父进程的除代码区之外的内存区域,和父进程 完全共享代码区
fork()创建子进程后,fork()之前的代码只有父进程执行一次,fork()之后的代码父子进程都执行一次(一共执行二次) fork()函数会返回2次,父进程返回 子进程pid ,子进程返回 0
fork()创建子进程后,规范中没有确定谁先运行,父子进程谁先运行和操作系统自身的算法有关,Linux中 父子进程谁先运行是不确定的
fork()创建子进程,如果父进程有文件描述符,子进程将复制文件描述符,但不复制文件表
-----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
pid_t pid = fork();//先open后fork,两个文件表
int fd = open("a.txt",O_RDWR|O_CREAT,0666);
if(fd == -1) perror("open"),exit(-1);
//pid_t pid = fork();//先fork后open,一个文件表
if(pid == 0)
{
write(fd,"abc",3);
close(fd);
exit(0);
}
sleep(1);
write(fd,"123",3);
close(fd);
}
-----------------------------------------------------------
练习: 测试父子进程的结束关系 - 孤儿进程
思路:先打印 子进程的父进程,然后子进程sleep(),父进程在sleep()期间结束,子进程sleep()结束后 再次打印父进程
作业:
写一个 ls -ial 效果的命令,属主和属组用ID即可,文件显示 具体信息(stat()),目录显示 当前文件目录下的所有子项目(不需要递归)
- day28_进程概念、子进程
- 进程的一些概念-父亲进程、子进程、僵尸进程、孤儿进程
- 进程概念
- 进程概念
- 进程与子进程
- 父进程 子进程
- 父进程子进程
- 子进程
- 子进程
- 子进程
- 在linux下父进程和子进程的概念是什么?如何理解?如何显示?
- 父进程与子进程
- 子进程与父进程
- 进程控制-创建子进程
- Linux进程与子进程
- 父进程与子进程
- nodejs-进程与子进程
- 子进程与父进程
- (Relax ST1.4)POJ 1056 IMMEDIATE DECODABILITY(判断一个字符串是否是另外一个字符串的前缀)
- java学习之路----IO---Scanner类
- Day27_UC文件操作其它函数(非读写)
- PHP调试利器XDebug的安装与使用
- 12个有趣的C语言面试题
- day28_进程概念、子进程
- ubuntu模拟root密码--源于网络,自己又实践了一下
- Day29_wait、waitpid及信号
- 自己做的打印菱形
- day30_信号
- Listener的使用(监听用户请求,ServletRequest范围内属性的变化)
- Day31_管道,共享内存,消息队列
- (Relax ST1.3)POJ 1045 Bode Plot
- Day32_简易版ATM