Unix/Linux编程实践教程四 stty

时间:2021-12-19 04:43:21
ls -C /dev |head -5

lp*  打印机
fd*  软驱
sd*  SCSI设备分区
tty*  终端

dsp文件是到声卡的一个连接
/dev/mouse读取这个文件可以读取鼠标的单击和位置变化


所有与文件相关的操作:open,read,write,lseek,close,stat

终端支持read和write,但不支持lseek...

>tty   //用来告诉用户所在终端的文件名
/dev/pts/0

设备文件的i节点存储的是指向内核子程序的指针,而不是文件的大小和存储列表。

内核中传输设备数据的子程序被成为设备驱动程序

主设备号确定处理该设备的子程序,而从设备号被作为参数传递给该程序

fcntl
目标 控制文件描述符
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
int result=fcntl(int fd,int cmd);
int result=fcntl(int fd,int cmd,long arg);
int result=fcntl(int fd,int cmd,struct flock *lockp);
fd 需要控制的文件描述符
cmd 需进行的操作
arg 操作的参数
lock 锁信息



属性:自动添加模式(防止竞争的发生)
int s;
s=fcntl(fd,F_GETFL);
s|=O_APPEND;
result=fcntl(fd,F_SETFL,s);
if(result==-1)
 perror("error");
else
 write(fd,&rec,1);//write record at end;

原子操作

open支持的标志位
O_CREAT 如果不存在,则创建该文件
O_TURNC 如果文件存在,则将文件长度置为
O_EXCL 防止两个进程创建同样的文件

O_EXCL、O_CREAT组合用来消除以下竞争情况:如果两个进程同时创建相同的文件会发生什么情况呢?
 
stty -echo//不回显字符
stty erase X //设置删除操作

改变终端驱动的设置:
a 从驱动程序获得属性
b 修改所要修改的属性
c 将修改过的属性送回驱动程序

struct termios attribs;
tcgetattr(fb,&setting);
setting.c_lflag|=ECHO;
tcsetarr(fd,TCSANOW,&setting);

int result=tcgetattr(int fd,struct termios *info);

int result=tcgetattr(int fd,int when,struct termios *info);

when:
TCSANOW 立即更新驱动程序设置
TCSADRAIN 等待直到驱动程序队列中的所有输出都被传送到终端,然后进行驱动程序的更新
TCSAFLUSH 等待直到驱动程序队列中的所有输出都被传送出去,然后释放所有队列中的所有输入数据,并进行一定的变化。

测试位 if(flagset&MASK)
置位flagset|=MASK
清除位flagset&=~MASK