api linux
linux api
2014-01-13 16:57:40 WMJ75617718 阅读数 568

flockfile


 void flockfile(FILE *filehandle);


进程内线程的互斥, 针对文件指针,同一文件的不同的文件指针对应不同的锁,不会互相影响
fp1 = fopen("xx", "w+");
fp2 = fopen("xx", "w+");
// 下面俩个均可锁上
flockfile(fp1); 
flockfile(fp2);

fcntl


fcntl(fd, F_SETLK, &lock);

进程间互斥锁,针对的是具体的文件对象,可以对文件内某个具体区域上锁,同一进程内,不论文件描述符(通过open,dup等获得新的fd)是否相同,只要它们指的是同一文件,便是指的同一个锁
fd1 = open("xx", ...); 
fcntl(fd1,F_SETLK, ...);  // 
fd2 = open("xx", ...);
// 同一进程内的后来的锁总是会生效
fcntl(fd1, F_SETLK, ...);  // 生效
fcntl(fd1, F_SETLK, ...);  // 生效
fcntl(fd2, F_UNLK, ...); // fd1上的锁也被释放


flock

int flock(int fd, int operation);

进程间互斥锁,针对的是文件描述符;同一文件不同文件描述符对应相同的锁,锁住整个文件
同一进程内,被锁住后,后面再锁会失败
flock不提供锁检查,也就是说在用flock之前需要用户自己去检查一下是否已经上了锁,说明白点就是读写文件之前用一下flock检查一下文件有没有上锁
A  call  to  flock() may block if an incompatible lock is held by another process
 Locks created by flock() are associated with an open file table entry.  This means that duplicate file  descriptors  (cre?
       ated  by,  for  example, fork(2) or dup(2)) refer to the same lock, and this lock may be modified or released using any of
       these descriptors.  Furthermore, the lock is released either by an explicit LOCK_UN operation on any  of  these  duplicate
       descriptors, or when all such descriptors have been closed.




       If a process uses open(2) (or similar) to obtain more than one descriptor for the same file, these descriptors are treated
       independently by flock().  An attempt to lock the file using one of these file descriptors may be denied by  a  lock  that
       the calling process has already placed via another descriptor.


linux API
2012-12-03 11:28:35 uyiwfn 阅读数 519
stat函数讲解

表头文件:    #include <sys/stat.h>
             #include <unistd.h>
定义函数:    int stat(const char *file_name, struct stat *buf);
函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值:      执行成功则返回0,失败返回-1,错误代码存于errno

错误代码:
    ENOENT         参数file_name指定的文件不存在
    ENOTDIR        路径中的目录存在但却非真正的目录
    ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
    EFAULT         参数buf为无效指针,指向无法存在的内存空间
    EACCESS        存取文件时被拒绝
    ENOMEM         核心内存不足
    ENAMETOOLONG   参数file_name的路径名称太长


#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    struct stat buf;
    stat("/etc/hosts", &buf);
    printf("/etc/hosts file size = %d\n", buf.st_size);
}


-----------------------------------------------------
struct stat {
    dev_t         st_dev;       //文件的设备编号
    ino_t         st_ino;       //节点
    mode_t        st_mode;      //文件的类型和存取的权限
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;      //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
};

先前所描述的st_mode 则定义了下列数种情况:
    S_IFMT   0170000    文件类型的位遮罩
    S_IFSOCK 0140000    scoket
    S_IFLNK 0120000     符号连接
    S_IFREG 0100000     一般文件
    S_IFBLK 0060000     区块装置
    S_IFDIR 0040000     目录
    S_IFCHR 0020000     字符装置
    S_IFIFO 0010000     先进先出

    S_ISUID 04000     文件的(set user-id on execution)位
    S_ISGID 02000     文件的(set group-id on execution)位
    S_ISVTX 01000     文件的sticky位

    S_IRUSR(S_IREAD) 00400     文件所有者具可读取权限
    S_IWUSR(S_IWRITE)00200     文件所有者具可写入权限
    S_IXUSR(S_IEXEC) 00100     文件所有者具可执行权限

    S_IRGRP 00040             用户组具可读取权限
    S_IWGRP 00020             用户组具可写入权限
    S_IXGRP 00010             用户组具可执行权限

    S_IROTH 00004             其他用户具可读取权限
    S_IWOTH 00002             其他用户具可写入权限
    S_IXOTH 00001             其他用户具可执行权限

    上述的文件类型在POSIX中定义了检查这些类型的宏定义:
    S_ISLNK (st_mode)    判断是否为符号连接
    S_ISREG (st_mode)    是否为一般文件
    S_ISDIR (st_mode)    是否为目录
    S_ISCHR (st_mode)    是否为字符装置文件
    S_ISBLK (s3e)        是否为先进先出
    S_ISSOCK (st_mode)   是否为socket


    若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名。

-----------------------------------------------------
struct statfs {
    long    f_type;          //文件系统类型
    long    f_bsize;         //块大小
    long    f_blocks;        //块多少
    long    f_bfree;         //空闲的块
    long    f_bavail;        //可用块
    long    f_files;         //总文件节点
    long    f_ffree;         //空闲文件节点
    fsid_t f_fsid;           //文件系统id
    long    f_namelen;       //文件名的最大长度
    long    f_spare[6];      //spare for later
};

stat、fstat和lstat函数(UNIX)


#include<sys/types.h>
#include<sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
提供文件名字,获取文件对应属性。感觉一般是文件没有打开的时候这样操作。
int fstat(int filedes, struct stat *buf);
通过文件描述符获取文件对应的属性。文件打开后这样操作
int lstat(const char *restrict pathname, struct stat *restrict buf);
连接文件

三个函数的返回:若成功则为0,若出错则为-1
给定一个pathname,stat函数返回一个与此命名文件有关的信息结构,fstat函数获得已在描述符filedes上打开的文件的有关信息。lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。

第二个参数是个指针,它指向一个我们应提供的结构。这些函数填写由buf指向的结构。该结构的实际定义可能随实现而有所不同,但其基本形式是:

struct stat{
mode_t st_mode;   /*file tpye &mode (permissions)*/
ino_t st_ino;     /*i=node number (serial number)*/
dev_t st_rdev;   /*device number for special files*/
nlink_t st_nlink; /*number of links*/
uid_t    st_uid; /*user id of owner*/
gid_t    st_gid; /*group ID of owner*/
off_t   st_size; /*size in bytes for regular files*/
time_t st_atime; /*time of last access*/
time_t st_mtime; /*time of last modification*/
time_t st_ctime; /*time of last file status change*/
long st_blksize; /*best I/O block size */
long st_blocks; /*number of 512-byte blocks allocated*/
};
   注意,除最后两个以外,其他各成员都为基本系统数据类型。我们将说明此结构的每个成员以了解文件属性。
 
使用stat函数最多的可能是ls-l命令,用其可以获得有关一个文件的所有信息。
1 函数都是获取文件(普通文件,目录,管道,socket,字符,块()的属性。
函数原型
#include <sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrict buf);
提供文件名字,获取文件对应属性。
int fstat(int filedes, struct stat *buf);
通过文件描述符获取文件对应的属性。
int lstat(const char *restrict pathname, struct stat *restrict buf);
连接文件描述命,获取文件属性。
2 文件对应的属性
struct stat {
        mode_t     st_mode;       //文件对应的模式,文件,目录等
        ino_t      st_ino;       //inode节点号
        dev_t      st_dev;        //设备号码
        dev_t      st_rdev;       //特殊设备号码
        nlink_t    st_nlink;      //文件的连接数
        uid_t      st_uid;        //文件所有者
        gid_t      st_gid;        //文件所有者对应的组
        off_t      st_size;       //普通文件,对应的文件字节数
        time_t     st_atime;      //文件最后被访问的时间
        time_t     st_mtime;      //文件内容最后被修改的时间
        time_t     st_ctime;      //文件状态改变时间
        blksize_t st_blksize;    //文件内容对应的块大小
        blkcnt_t   st_blocks;     //伟建内容对应的块数量
      };
2009-08-30 09:55:00 android83 阅读数 708
    The Linux Kernel API is an application programming interface providing a uniform method for device drivers and other low-level software written for the Linux kernel to access system resources and services.

2019-06-03 14:00:24 renlonggg 阅读数 31

原文地址:https://blog.csdn.net/abcamus/article/details/77825129

Linux在枚举PCIe设备的过程由内核中的PCI框架负责,在EP配置完成之后,驱动通过以下接口访问PCIe空间,原理参考前文《大话PCIe:设备枚举》
一、访问配置空间

相关接口位于drivers/pci/access.c
1.1 读配置空间

    pci_read_config_byte(const struct pci_dev *dev, int where, u8 *val);
    pci_read_config_word(const struct pci_dev *dev, int where, u16 *val);
    pci_read_config_dword(const struct pci_dev *dev, int where, u32 *val);

1.2 写配置空间

    pci_write_config_byte(const struct pci_dev *dev, int where, u8 *val);
    pci_write_config_word(const struct pci_dev *dev, int where, u16 *val);
    pci_write_config_dword(const struct pci_dev *dev, int where, u32 *val);

二、访问BAR空间

在枚举过程中,PCI驱动已经分配了address给各个BAR,通过一些接口就可以访问到BAR Resource。
2.1 获取BAR Resource

位于include/linux/pci.h,以宏的形式提供。

    pci_resource_start(dev, bar)
    pci_resource_end(dev, bar)
    pci_resource_flags(dev, bar)
    pci_resource_len(dev, bar)

通过pci_resource_start宏取得bar值之后,Linux认为这个地址是IO地址,如果要访问的话可以通过ioremap映射到内核空间,然后通过readl/writel等IO接口进行操作。
---------------------
作者:Camus Qiu
来源:CSDN
原文:https://blog.csdn.net/abcamus/article/details/77825129
版权声明:本文为博主原创文章,转载请附上博文链接!

2013-09-26 21:06:50 wujiangguizhen 阅读数 461

linux hook api

阅读数 450

编译hook库    gcc-shared源文件名-o共享库文件名-ldl-fPIC    如果共享库中用到了dlopen则需要-ldl  设置环境变量 LD_PRELOAD如    LD_PRELOAD="./libmyc.so"

博文 来自: swimablefish

linux 工作队列之API

阅读数 444

自2.6.20起,工作队列的数据结构发生了一些变化,使用时不能沿用旧的方法。1、在工作队列中被调用的函数原形如下:   typedefvoid(*work_func_t)(structwork_struct*work);2、定义了一个新的结构delayed_work用于处理延迟执行:structdelayed_work{   structw

博文 来自: peijian1998

The Linux Kernel API

阅读数 7

http://www.gnugeneration.com/books/linux/2.6.20/kernel-api/index.htmlNameplatform_get_resource—getaresourceforadeviceSynopsisstructresource*platform_get_resource(structplatf...

博文 来自: weixin_34124651

Linux API节选

阅读数 166

(一)文件操作篇 1、creat(建立文件)定义函数1intcreat(constchar*pathname,mode_tmode);函数说明参数pathname指向欲建立的文件路径字符串。creat()相当于使用下列的调用方式调用open()1open(constchar*pathname,(O_CREAT|O_W

博文 来自: zifeng274059226

Linux API Hook

阅读数 339

最近我查阅很多参考资料.发现对于讲述Linux HOOK API的资料是很少,让我们这些新人难以去走进Linux HOOK大门.在这里我将全面的讲述Linux HOOK API的全部实现过程,这个过程中我也遇到很多坎坷,所以在这么写下这份教程.让大家都来进入HOOK的神秘世界.不要认为HOOK API是windows的专利(PS.其实我以前就是这么认为的.哈哈....),其实在Linux中也有

博文 来自: zy531
没有更多推荐了,返回首页