操作系统原理(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wcs_152/article/details/83245319
  1. 标准文件描述符
    Linux系统将每个对象当作文件处理。这包括输入和输出进程。Linux用文件描述符(file descriptor)来标识每个文件对象。文件描述符在形式上是一个非负整数,可以唯一标识会话中打开的文件。出于特殊目的,bash shell 保留了前三个文件描述符(0、1和2),见下表。
文件描述符 缩写 描述
0 STDIN 标准输入
1 STDOUT 标准输出
2 STDERR 标准错误
  1. dup()和dup2()函数
#include<unistd.h>
int dup(int fd);
int dup2(int oldfd,int newfd);
  • dup()和dup2()函数都可以用来复制一个文件描述符
  • dup()函数返回的文件描述符是当前可用文件描述符中最小数值
  • dup2()与dup()的区别在于可以用newfd来指定新描述符数值,若newfd指向的文件已经被打开,会先将其关闭。若newfd等于oldfd,就不关闭newfd,newfd和oldfd共同指向一份文件。
  1. dup2(fd, 1)
    即原本是指向标准输出文件描述结构体的1指向了fd,
    原本输出到显示器终端的字符串打印到fd文件中。

  2. 管道代码
    linux管道pipe详解

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    int pfds[2];
    if ( pipe(pfds)==0 ){//创建管道成功返回0
        if (fork() == 0){//fork()调用一次返回两次
            //子进程fork()返回0
            close(1);//关闭标准输出
            dup2(pfds[1], 1);//1指向pfds[1]
            close(pfds[0]);//随后关掉管道的读端
            //规定数据从管道的写端流入 从读端流出
            execlp( "ls", "ls", "-1", NULL );//ls -l的结果写入管道
        }
        else{
           //父进程fork()返回子进程PID
            close(0);//关闭标准输入
            dup2( pfds[0], 0 );//0指向pfds[0]
            close(pfds[1]);//随后关掉管道的写端
            execlp( "wc", "wc", "-l", NULL );//读取管道的内容 wc -l
        }
    }
    return 0;
}
  1. exec函数族,wait()函数
    在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事)。
    用户进程之fork()与exec函数族篇

  2. open()函数
    open函数的参数和作用

猜你喜欢

转载自blog.csdn.net/wcs_152/article/details/83245319