`

linux 系统编程学习笔记二

阅读更多



lseek
文件在打开时读写位置是0,如果是以O_APPEND方式打开,位置会移致动到文件末尾
#include <sys/types.h>
#include <unistd.h>
/*移动当前读写位置
参数同fseek
offset 偏移量
whence 起始位置
*/
off_t lseek(int fd,off_t offset,int whence);


打开文件的当前偏移量
off_t currpos;
currpos=lseek(fd,0,SEEK_CUR);




fcntl
改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞标志(file status


flag)
#include <unistd.h>
#include <fcntl.h>


int fcntl(int fd,int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock *lock);


实现非阻塞读终端
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>


#define MSG_TRY "try again\n"


/* 使用F_GETFL 和F_SETFL两种fcntl命令改变STDIN_FILENO的属性*/
int main(void){
char buf[10];
int n;
int flags;

flags=fcntl(STDIN_FILENO,F_GETFL);
flags|=O_NONBLOCK;
if(fcntl(STDIN_FILENO,F_SETFL,flags)==-1){
perror("fcntl");
exit(1);
}
tryagain:
n=read();
if(n<0){
if(errno==EAGAIN){
sleep(1);
write(STDOUT_FILENO,MSG_TRY,strlen(MSG_TRY));
goto tryagain;
}
perror("read stdin");
exit(1);
}
write(STDOUT_FILENO,buf,n);
return 0;
}




#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>


/*通过命令行的第一个参数指定一个文件描述符,利用shell的重定向功能在
该描述符上打开文件,然后用fcntl的F_GETFL命令取出file status flagv
*/
int main(int argc,char *argv[]){
int val;
if(argc!=2){
fputs("usage:a.out<descriptor#>\n",stderr);
exit(1);
}
if((val=fcntl(atoi(argv[1]),F_GETFL))<0){
printf("fcntl error for fd %d\n",atoi(argv[1]));
exit(1);
}
switch(val & O_ACCMODE){
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
fputs("invalid access mode\n",stderr);
exit(1);
}
if(val & O_APPEND)
printf(",append");
if(val & O_NONBLOCK)
printf(",nonblocking");
putchar('\n');
return 0;
}
运行结果:
yuezhenhua@ubuntu:/opt/sdk/tc$ ./a.out 0 </dev/tty
read only


ioctl
用于向设备发控制和配置命令,这些数据是不能通过read/write读写的(out-of-band)数据
ioctl发送的是控制信息,其中的数据是辅助数据
例如在串口线上收发数据通过read/wirte操作,串口的波特率、校验位、停止位通过ioctl设


置,A/D转换的结果通过read读取,而A/D转换的精度和工作频率通过ioctl设置


#include <sys/ioctl.h>
/*
d文件描述符
request是ioctl的命令
可变参数是一个指向变量或结构体的指针
*/
int ioctl(int d,int request,...);




#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>


/*取得终端设备的窗口大小*/
int main(void){
struct winsize size;
if(isatty(STDOUT_FILENO)==0){
exit(1);
}
if(ioctl(STDOUT_FILENO,TIOCGWINSZ,&size)<0){
perror("ioctl TIOCGWINSZ error");
exit(1);
}
printf("%d rows,%d columns\n",size.ws_row,size.c4
运行结果:
yuezhenhua@ubuntu:/opt/sdk/tc$ gcc test44.c -o test44
yuezhenhua@ubuntu:/opt/sdk/tc$ ./test44
24 rows,80 columns

分享到:
评论

相关推荐

    LINUX系统编程学习笔记

    GUN/LINUX系统编程学习笔记,分享快乐。

    Linux系统编程学习笔记完整版PDF最新版本

    Linux系统编程是一门专注于Linux操作系统上应用程序和工具开发的学科。它包含了广泛的领域,如文件操作、进程管理、内存管理以及网络编程等。开发者在这一领域中,从基础的文件系统交互到复杂的网络通信和多线程编程...

    linux系统编程笔记

    Linux系统编程笔记涉及到的内容广泛,涵盖了从基础的出错处理到进程管理,从内存管理到进程间通信,以及守护进程设计等多个层面的知识。下面详细说明各个部分的知识点: 1. 常见出错处理 - abort函数用于异常终止...

    Linux Shell编程学习笔记

    Linux Shell编程学习笔记

    Linux系统设计-Linux系统编程学习笔记

    Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。

    Linux系统编程学习笔记

    ### Linux系统编程学习笔记 #### 一、IO **1.1 标准I/O (stdio)** - **fopen/fclose**: `fopen` 用于打开或创建一个文件,并返回一个指向该文件的 `FILE *` 类型的指针。`fclose` 用于关闭由 `FILE *` 指向的文件...

    linux 系统编程 尚观 linux内核驱动开发 笔记

    【Linux 系统编程与内核驱动开发笔记】 在深入探讨Linux系统编程和内核驱动开发之前,我们首先要理解Linux操作系统的基本概念。Linux是一种自由、开放源码的类Unix操作系统,广泛应用于服务器、桌面环境以及各种...

    Linux零基础学习笔记 Shell编程-菜鸟入门(超详细)

    Linux是开源的操作系统,它的命令行界面,尤其是Shell编程...因此,无论你是技术小白还是希望进一步提升,这份“Linux零基础学习笔记 Shell编程-菜鸟入门”都会是你宝贵的资源。祝你在学习的道路上越走越远,不断进步!

    Linux系统设计-linux系统网络编程学习笔记

    Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。

    linux编程学习笔记PDF资料下载.txt

    根据提供的文件信息,我们可以推断出这是一份关于Linux编程学习笔记的PDF资料。下面将对这份资料可能涉及的关键知识点进行详细的阐述。 ### Linux编程基础知识 #### 1. Linux操作系统概述 - **定义与特点**:Linux...

    linux系统编程及网络编程笔记

    总的来说,"Linux系统编程及网络编程笔记"会详细解析上述各个方面,包括理论知识、实际示例和最佳实践,旨在帮助学习者深入理解Linux环境下的系统编程和网络编程,为开发高效、安全的系统级应用程序和网络服务打下...

    linux网络编程学习笔记

    第二个是将 32 位 IP转换为 a.b.c.d 的格式 服务信息函数 在网络程序里面我们有时候需要知道端口.IP和服务信息.这个时候我们可以使用以下几 个函数 int getsockname(int sockfd,struct sockaddr *localaddr,int ...

    Linux系统设计-linux 编程环境学习笔记,含 linux 基本命令,linux 操作系统,linux 下 C++ 编程等

    Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。

    linux从做系统学习笔记

    Linux操作系统是全球众多程序员...总之,Linux操作系统的学习笔记覆盖了从系统安装到文件管理,从用户权限到进程调度,从设备管理到网络控制等多个层面的知识点,是学习Linux操作系统和提升系统管理能力的重要资源。

    Linux系统设计-Linux系统编程笔记

    Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。

    linux项目工程资料-linux系统网络编程学习笔记.zip

    该项目以Linux内核为核心,围绕其构建了一个完整的操作系统,包括各种系统工具、库、应用程序和硬件支持。 以下是Linux项目的一些主要特点和资料介绍: 开放源代码:Linux项目的所有源代码都是公开的,并允许任何...

    linux学习笔记.pdf

    本文档主要记录了 Linux 操作系统的学习笔记,涵盖了 Basic 的编程、VI 编辑器的使用、GCC 编译器的应用、GDB 调试工具的使用等方面的知识点。 一、编程基础 * 了解 C 语言的基本语法,例如变量声明、数据类型、...

    系统信息与系统资源-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

    系统信息与系统资源-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

Global site tag (gtag.js) - Google Analytics