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()),目录显示 当前文件目录下的所有子项目(不需要递归)




原创粉丝点击