user space syscall/library API misc

user space syscall/library API misc

get thread name

get thread name:
char threadname[20] = {'\0'};
prctl(PR_GET_NAME,(unsigned long)threadname);
get pid:
getpid()
get TID of a process(value would like 3245):
syscall(SYS_gettid)

 

tgkill()

这个glibc没有给它warpper,如需调用,需要通过syscall()的方式:

syscall(SYS_tgkill, tgid, tid, sig)

文件读写指针

open一个文件后,文件的读写指针此时是在文件的末尾的,就是在append write开始写的位置,

所以如果需要读文件开头处的内容,需要调用lseek()先将读写指针指向文件开头:

lseek(fd, 0, SEEK_SET)

lseek()

SEEK_SET:从文件开头处偏移offset个byte,此时offset只能是offset >= 0,即只能往前偏移

SEEK_CUR:基于文件当前读写指针位置偏移offset个byte,offset小于0,则是往后偏移;如果大于0,则往前偏移

SEEK_END:基于文件末尾偏移offset个byte,offset小于0,则是往后偏移;如果大于0,则往前偏移

上述这里的往后、前的含义以append write的方向为参考,append write的方向是往前

off_t lseek(int fd, off_t offset, int whence)

lseek()返回值是设置读写指针位置后的读写指针位置(offset),如果fail返回-1

lseek()常用用法

用法 含义
lseek(fd, 0, SEEK_CUR) 获取当前读写指针位置(offset)
lseek(fd, 0, SEEK_SET) 将读写指针指向文件开头
lseek(fd, 0, SEEK_END) 将读写指针移动到文件末尾

 

 

 

 

open/read/write

 

    unsigned char buffer[50] = {0};
    unsigned char read_buf[50] = {0};
    
    /* open */
    fd = open("/data/wksrcconf.txt", O_RDWR|O_APPEND|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO);
    
    /* write */
    memset(buffer, 0, 50);
    sprintf(buffer, "stWakeSrc: %d.\n", stWakeSrc);
    write(fd, buffer, strlen(buffer)+1);
    
    /* read */
    offset = lseek(fd, 0, SEEK_CUR); //save rw pointer/offset
    lseek(fd, 0, SEEK_SET); //set rw pointer/offset to file start
    cnt = read(fd, read_buf, 6); //read content from file start
    lseek(fd, offset, SEEK_SET); //restore rw pointer/offset
    
    printf("read_buf is %s.\n", read_buf);

关于open()参数的说明(可执行man 2 open查看detail)

O_APPEND: 表示write时追加写

O_CREAT: 表示文件不存在时创建此问题,此时需要传入第三个参数mode_t mode

S_IRWXU|S_IRWXG|S_IRWXO: 表示用户、group、other组均有RWX权限

获取系统时间(Y/M/D/H/M/S)

unsigned char buffer[50] = 0;
time_t ltime;
time(&ltime);
sprintf(buffer, "%s", asctime(gmtime(&ltime)));
printf("sys time is %s.\n", buffer);

 

上面获取的sys time如下面的格式:

Sun Sep 25 00:22:09 2022

user space获取系统uptime(kernel log前的uptime时间戳)

unsigned char buffer[50] = {0};

struct sysinfo info = {0};
sysinfo(&info);
sprintf(buffer, "[%ld]:\n", info.uptime);

 

struct sysinfo definition如下:

struct sysinfo {
    long uptime;             /* Seconds since boot */
    unsigned long loads[3];  /* 1, 5, and 15 minute load averages */
    unsigned long totalram;  /* Total usable main memory size */
    unsigned long freeram;   /* Available memory size */
    unsigned long sharedram; /* Amount of shared memory */
    unsigned long bufferram; /* Memory used by buffers */
    unsigned long totalswap; /* Total swap space size */
    unsigned long freeswap;  /* swap space still available */
    unsigned short procs;    /* Number of current processes */
    unsigned long totalhigh; /* Total high memory size */
    unsigned long freehigh;  /* Available high memory size */
    unsigned int mem_unit;   /* Memory unit size in bytes */
    char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding to 64 bytes */
};

 

posted @ 2021-05-02 14:07  aspirs  阅读(67)  评论(0编辑  收藏  举报