lseek fd 0 seek set(linux open函数创建文件的默认权限问题)

:暂无数据 2026-09-14 20:40:01 :0

lseek fd 0 seek set(linux open函数创建文件的默认权限问题)

这篇文章给大家聊聊关于lseek fd 0 seek set,以及linux open函数创建文件的默认权限问题对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

linux open函数创建文件的默认权限问题

#include 《stdio.h》
#include 《sys/types.h》
#include 《sys/stat.h》
#include 《fcntl.h》
#include 《unistd.h》
#include 《string.h》
int main() {
int fd = -1;
fd = open("zhidao_561804018.dat", O_CREAT | O_TRUNC | O_RDWR, 0666);
if (fd 《 0) {
perror("open");
return -1;
}
char buff;
strcpy(buff, "Hello!I am writing to this file!");
int count = strlen(buff);
if (write(fd, buff, count) 《 0) {
perror("write");
return -1;
}
if (lseek(fd, 0, SEEK_SET) 《 0) {
perror("lseek");
return -1;
}
if (read(fd, buff, 10) 《 0) {
perror("read");
return -1;
}
buff = 0x00;
printf("%s\n", buff);
if (fd 》 0) {
close(fd);
fd = -1;
}
return 0;
}

linux C函数write()写入的数据是如何存储的read()又是如何读取的

使用二进制存储
write(fd, &student, sizeof(student));
read(fd, &student, sizeof(student));
如果要读取里面第3个student的内容:
lseek(fd, 2 * sizeof(student), SEEK_SET); //即从开始搜索2个student那么长。
这样的前提是student中没有指针,因为每次运行指针的内容是不确定的。

linux 下/sys/class/gpio 怎么注册

通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入。文件IO方式操作GPIO,使用到了4个函数open、close、read、write。

首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入 Device Drivers-》 GPIO Support -》/sys/class/gpio/… (sysfs interface)。

/sys/class/gpio 的使用说明:
gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射
◇ 控制GPIO的目录位于/sys/class/gpio
◇ /sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号
◇ /sys/class/gpio/unexport 用于通知系统取消导出
◇ /sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称,引脚总数 导出一个引脚的操作步骤
◇ 首先计算此引脚编号,引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数
◇ 向/sys/class/gpio/export写入此编号,比如12号引脚,在shell中可以通过以下命令实现,命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出
◇ direction文件,定义输入输入方向,可以通过下面命令定义为输出。direction接受的参数:in, out, high, low。high/low同时设置方向为输出,并将value设置为相应的1/0
◇ value文件是端口的数值,为1或0

几个例子:
1. 导出
/sys/class/gpio# echo 44 》 export
2. 设置方向
/sys/class/gpio/gpio44# echo out 》 direction
3. 查看方向
/sys/class/gpio/gpio44# cat direction
4. 设置输出
/sys/class/gpio/gpio44# echo 1 》 value
5. 查看输出值
/sys/class/gpio/gpio44# cat value
6. 取消导出
/sys/class/gpio# echo 44 》 unexport

文件读写例程:
#include stdlib.h
#include stdio.h
#include string.h
#include unistd.h
#include fcntl.h //define O_WRONLY and O_RDONLY

//芯片复位引脚: P1_16
#define SYSFS_GPIO_EXPORT "/sys/class/gpio/export"
#define SYSFS_GPIO_RST_PIN_VAL "48"
#define SYSFS_GPIO_RST_DIR "/sys/class/gpio/gpio48/direction"
#define SYSFS_GPIO_RST_DIR_VAL "OUT"
#define SYSFS_GPIO_RST_VAL "/sys/class/gpio/gpio48/value"
#define SYSFS_GPIO_RST_VAL_H "1"
#define SYSFS_GPIO_RST_VAL_L "0"

int main()
{
int fd;

//打开端口/sys/class/gpio# echo 48 》 export
fd = open(SYSFS_GPIO_EXPORT, O_WRONLY);
if(fd == -1)
{
printf("ERR: Radio hard reset pin open error.\n");
return EXIT_FAILURE;
}
write(fd, SYSFS_GPIO_RST_PIN_VAL ,sizeof(SYSFS_GPIO_RST_PIN_VAL));
close(fd);

//设置端口方向/sys/class/gpio/gpio48# echo out 》 direction
fd = open(SYSFS_GPIO_RST_DIR, O_WRONLY);
if(fd == -1)
{
printf("ERR: Radio hard reset pin direction open error.\n");
return EXIT_FAILURE;
}
write(fd, SYSFS_GPIO_RST_DIR_VAL, sizeof(SYSFS_GPIO_RST_DIR_VAL));
close(fd);

//输出复位信号: 拉高》100ns
fd = open(SYSFS_GPIO_RST_VAL, O_RDWR);
if(fd == -1)
{
printf("ERR: Radio hard reset pin value open error.\n");
return EXIT_FAILURE;
}
while(1)
{
write(fd, SYSFS_GPIO_RST_VAL_H, sizeof(SYSFS_GPIO_RST_VAL_H));
usleep(1000000);
write(fd, SYSFS_GPIO_RST_VAL_L, sizeof(SYSFS_GPIO_RST_VAL_L));
usleep(1000000);
}
close(fd);

printf("INFO: Radio hard reset pin value open error.\n");
return 0;

}
另外参考网上一个网友的程序,这里做了验证,并实现中断检测函数。如下:
#include stdlib.h
#include stdio.h
#include string.h
#include unistd.h
#include fcntl.h
#include poll.h
#define MSG(args...) printf(args)
//函数声明
static int gpio_export(int pin);
static int gpio_unexport(int pin);
static int gpio_direction(int pin, int dir);
static int gpio_write(int pin, int value);
static int gpio_read(int pin);
static int gpio_export(int pin)
{
char buffer;
int len;
int fd;

fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd 《 0) {
MSG("Failed to open export for writing!\n");
return(-1);
}

len = snprintf(buffer, sizeof(buffer), "%d", pin);
if (write(fd, buffer, len) 《 0) {
MSG("Failed to export gpio!");
return -1;
}

close(fd);
return 0;
}
static int gpio_unexport(int pin)
{
char buffer;
int len;
int fd;

fd = open("/sys/class/gpio/unexport", O_WRONLY);
if (fd 《 0) {
MSG("Failed to open unexport for writing!\n");
return -1;
}

len = snprintf(buffer, sizeof(buffer), "%d", pin);
if (write(fd, buffer, len) 《 0) {
MSG("Failed to unexport gpio!");
return -1;
}

close(fd);
return 0;
}
//dir: 0--》IN, 1--》OUT
static int gpio_direction(int pin, int dir)
{
static const char dir_str = "in\0out";
char path;
int fd;

snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction", pin);
fd = open(path, O_WRONLY);
if (fd 《 0) {
MSG("Failed to open gpio direction for writing!\n");
return -1;
}

if (write(fd, &dir_str, dir == 0 ? 2 : 3) 《 0) {
MSG("Failed to set direction!\n");
return -1;
}

close(fd);
return 0;
}
//value: 0--》LOW, 1--》HIGH
static int gpio_write(int pin, int value)
{
static const char values_str = "01";
char path;
int fd;

snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);
fd = open(path, O_WRONLY);
if (fd 《 0) {
MSG("Failed to open gpio value for writing!\n");
return -1;
}

if (write(fd, &values_str, 1) 《 0) {
MSG("Failed to write value!\n");
return -1;
}

close(fd);
return 0;
}
static int gpio_read(int pin)
{
char path;
char value_str;
int fd;

snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);
fd = open(path, O_RDONLY);
if (fd 《 0) {
MSG("Failed to open gpio value for reading!\n");
return -1;
}

if (read(fd, value_str, 3) 《 0) {
MSG("Failed to read value!\n");
return -1;
}

close(fd);
return (atoi(value_str));
}
// none表示引脚为输入,不是中断引脚
// rising表示引脚为中断输入,上升沿触发
// falling表示引脚为中断输入,下降沿触发
// both表示引脚为中断输入,边沿触发
// 0--》none, 1--》rising, 2--》falling, 3--》both
static int gpio_edge(int pin, int edge)
{
const char dir_str = "none\0rising\0falling\0both";
char ptr;
char path;
int fd;
switch(edge){
case 0:
ptr = 0;
break;
case 1:
ptr = 5;
break;
case 2:
ptr = 12;
break;
case 3:
ptr = 20;
break;
default:
ptr = 0;
}

snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/edge", pin);
fd = open(path, O_WRONLY);
if (fd 《 0) {
MSG("Failed to open gpio edge for writing!\n");
return -1;
}

if (write(fd, &dir_str)) 《 0) {
MSG("Failed to set edge!\n");
return -1;
}

close(fd);
return 0;
}
//GPIO1_17
int main()
{
int gpio_fd, ret;
struct pollfd fds;
char buff;
unsigned char cnt = 0;
//LED引脚初始化
gpio_export(115);
gpio_direction(115, 1);
gpio_write(115, 0);
//按键引脚初始化
gpio_export(49);
gpio_direction(49, 0);
gpio_edge(49,1);
gpio_fd = open("/sys/class/gpio/gpio49/value",O_RDONLY);
if(gpio_fd 《 0){
MSG("Failed to open value!\n");
return -1;
}
fds.fd = gpio_fd;
fds.events = POLLPRI;
ret = read(gpio_fd,buff,10);
if( ret == -1 )
MSG("read\n");
while(1){
ret = poll(fds,1,0);
if( ret == -1 )
MSG("poll\n");
if( fds.revents & POLLPRI){
ret = lseek(gpio_fd,0,SEEK_SET);
if( ret == -1 )
MSG("lseek\n");
ret = read(gpio_fd,buff,10);
if( ret == -1 )
MSG("read\n");
gpio_write(115, cnt++%2);
}
usleep(100000);
}
return 0;
}

在linux的网络编程里有这句话if((off=lseek(fd,0,1))<0),其中lseek中的第三个参数怎么会能用1呢谢谢!

lseek(int fildes,off_t offset ,int whence);是移动文件读/写指针 函数 
其中 int whence 为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2).
SEEK_SET 代表读写位置指向文件头
  SEEK_CUR 代表目前的读写位置
  SEEK_END 代表读写位置指向文件尾
这里的1和SEEK-CUR 是同一个意思。

函数“lseek”的参数太少

Linux的lseek函数用来控制一个打开的文件的读写位置,它的函数原型如下:
off_t lseek(int fildes,off_t offset ,int whence);
参数的用法:fildes参数为一个已打开的文件描述符;参数offset为读写位置的位移数,这个位移数是根据参数whence来确定的;whence参数分为下列三种:
SEEK_SET:表示offset用来直接设置读写位置。
SEEK_CUR:表示以目前的读写位置往后增加offset个位移量。
SEEK_END:表示将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR或SEEK_END时,参数offet允许负值出现。当lseek调用成功时返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno会存放错误代码。下面是几个使用示例:
将读写位置移到文件开头:lseek(myfile, 0, SEEK_SET);
将读写位置移到文件尾:lseek(myfile, 0, SEEK_END);
想要取得目前文件位置:off_t cur=lseek(myfile, 0, SEEK_CUR);
注意:使用lseek函数需要包含以下头文件:
#include 《sys/types.h》
#include 《unistd.h》

linux open函数创建文件的默认权限问题的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux open函数创建文件的默认权限问题、linux open函数创建文件的默认权限问题的信息别忘了在本站进行查找哦。

lseek fd 0 seek set(linux open函数创建文件的默认权限问题)

本文编辑:admin

更多文章:


mariadb忘记密码(mysql用户密码忘记了怎么办)

mariadb忘记密码(mysql用户密码忘记了怎么办)

大家好,mariadb忘记密码相信很多的网友都不是很明白,包括mysql用户密码忘记了怎么办也是一样,不过没有关系,接下来就来为大家分享关于mariadb忘记密码和mysql用户密码忘记了怎么办的一些知识点,大家可以关注收藏,免得下次来找不

2026年10月15日 07:50

mysql端口号(如何查看自己数据库的端口号)

mysql端口号(如何查看自己数据库的端口号)

“mysql端口号”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看mysql端口号(如何查看自己数据库的端口号)!

2026年10月15日 06:30

printf打印16进制(C语言 十六进制怎么输出)

printf打印16进制(C语言 十六进制怎么输出)

大家好,今天小编来为大家解答以下的问题,关于printf打印16进制,C语言 十六进制怎么输出这个很多人还不知道,现在让我们一起来看看吧!

2026年10月15日 06:00

avantage怎么设置为中文(Avantage安装丢失GIT)

avantage怎么设置为中文(Avantage安装丢失GIT)

大家好,如果您还对avantage怎么设置为中文不太了解,没有关系,今天就由本站为大家分享avantage怎么设置为中文的知识,包括Avantage安装丢失GIT的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月15日 03:00

ospf协议的作用是什么(OSPF路由协议的作用是什么)

ospf协议的作用是什么(OSPF路由协议的作用是什么)

“ospf协议的作用是什么”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看ospf协议的作用是什么(OSPF路由协议的作用是什么)!

2026年10月15日 02:40

方案对比特效js(在一个网页中如何实现两个JS特效)

方案对比特效js(在一个网页中如何实现两个JS特效)

各位老铁们好,相信很多人对方案对比特效js都不是特别的了解,因此呢,今天就来为大家分享下关于方案对比特效js以及在一个网页中如何实现两个JS特效的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月15日 02:10

activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)

activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)

今天给各位分享登陆视频监控网页时提示activex控件未注册,怎么解决的知识,其中也会对登陆视频监控网页时提示activex控件未注册,怎么解决进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 20:30

学生信息管理系统c语言(用C语言编程学生信息管理系统!)

学生信息管理系统c语言(用C语言编程学生信息管理系统!)

今天给各位分享用C语言编程学生信息管理系统!的知识,其中也会对用C语言编程学生信息管理系统!进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 20:20

excel连接sql数据库教程(excel怎么连接sql数据库)

excel连接sql数据库教程(excel怎么连接sql数据库)

本篇文章给大家谈谈excel连接sql数据库教程,以及excel怎么连接sql数据库对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月14日 19:40

null s brawl(null和空字符有区别吗)

null s brawl(null和空字符有区别吗)

今天给各位分享null和空字符有区别吗的知识,其中也会对null和空字符有区别吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 19:00

最近更新

广告推广app(常见的app推广方式)
2026-10-15 09:20:01 浏览:0
热刺vs马赛比赛(热刺赛程比分)
2026-10-15 09:10:01 浏览:0
热门文章

标签列表