symlink readlink link建立、读取,使用readlink获取当前程序目录

41 篇文章 2 订阅
symlink 函数和 readlink 函数主要是针对符号链接文件的操作。symlink 函数用来创建符号链接文件,和 link 文件是对应的。readlink 函数用来读取链接文件本身的内容(也就是符号链接指向的文件的文件名)。


头文件: #include <unistd.h>


函数原型:
int symlink(const char* actualpath,const char* sympath);
int symlinkat(const char *actualpath,int fd,const char *sympath);  
如果sympath参数指定的是绝对路径或者fd参数设置了AT_FDCWD值,那么symlinkat就等同于symlink函数。
函数参数:
oldpath:源文件的路径名
newpath:符号链接文件的路径名
返回值:
调用成功时返回 0
调用失败时返回 -1
错误代码:
1、EPERM 参数actualpath 与sympath所指的文件系统不支持符号连接。
2、EROFS 欲测试写入权限的文件存在于只读文件系统内。
3、EFAULT 参数actualpath 或sympath 指针超出可存取内存空间。
4、ENAMETOOLONG 参数actualpath 或sympath 太长。
5、ENOMEM 核心内存不足。
6、EEXIST 参数newpath 所指的文件名已存在。
7、EMLINK 参数actualpath 所指的文件已达到最大连接数目。
8、ELOOP 参数sympath 有过多符号连接问题。
9、ENOSPC 文件系统的剩余空间不足。
10、EIO I/O 存取错误。


定义函数:
int  readlink(const  char *path,  char *buf, size_t  bufsiz);
int  readlinkat(int fd,const char* path,char *buf,size_t bufsize);  
当pathname参数指定的是绝对路径名或者fd参数的值为AT_FDCWD,readlinkat函数的行为与readlink相同。但是,如果fd参数是一个打开目录的有效文件描述符并且pathname参数是相对路径名,则readlinkat计算相对于由fd代表的打开目录的路径。
这两个函数组合了open、read和close的所有操作。如果函数成功执行,则返回读入buf的字节数。在buf中返回的符号链接的内容不以null字符终止。
函数参数;
path:读取的符号链接文件的路径名
buf:用来存储读出的文件内容
bufsiz:想要读取的字节数
返回值   :执行成功则传符号连接所指的文件路径字符串,失败返回-1, 错误代码存于errno
错误代码:
               EACCESS                  取文件时被拒绝,权限不够
               EINVAL                    参数bufsiz为负数
               EIO                         O存取错误
               ELOOP                     欲打开的文件有过多符号连接问题
               ENAMETOOLONG       参数path的路径名称太长
               ENOENT                   参数path所指定的文件不存在
               ENOMEM                   核心内存不足
               ENOTDIR                   参数path路径中的目录存在但却非真正的目录




获取当前exe的路径
#include <stdio.h>
#include <unistd.h>
char * get_exe_path( char * buf, int count)
{
    int i;
    int rslt = readlink("/proc/self/exe", buf, count - 1);
    if (rslt < 0 || (rslt >= count - 1))
    {
        return NULL;
    }
    buf[rslt] = '\0';
    for (i = rslt; i >= 0; i--)
    {
        printf("buf[%d] %c\n", i, buf[i]);
        if (buf[i] == '/')
        {
            buf[i + 1] = '\0';
            break;
        }
    }
    return buf;
}


int main(int argc, char ** argv)
{
    char path[1024];
    printf("%s\n", get_exe_path(path, 1024));
    return 0;
}


symlinkat和readlinkat函数的实例程序如下:
#include <stdio.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <string.h>  
#include <errno.h>  
#include <sys/types.h>  
#include <dirent.h>  
#define BUFFSIZE 1024  
  
int main(int argc,char *argv[])  
{  
    if(argc != 4){  
        printf("param too few\n");  
        exit(EXIT_FAILURE);  
    }  
  
    char buf[BUFFSIZE];  
    ssize_t sz;  
    DIR *dp;  
    int fd;  
  
    //获取相对路径名返回的文件描述符fd  
    if((dp = opendir(argv[2])) == NULL){  
        perror("opendir");  
        exit(EXIT_FAILURE);  
    }  
    if((fd = dirfd(dp)) < 0){  
        perror("dirfd");  
        exit(EXIT_FAILURE);  
    }  
  
    //创建符号链接  
    if(symlinkat(argv[1],fd,argv[3]) < 0){  
        perror("symlinkat");  
        exit(EXIT_FAILURE);  
    }  
  
    //读取符号链接  
    memset(buf,0,sizeof(buf));  
    if((sz = readlinkat(fd,argv[3],buf,sizeof(buf))) < 0){  
        perror("readlinkat");  
        exit(EXIT_FAILURE);  
    }  
  
    printf("buf:%s,length:%u\n",buf,(unsigned int)sz);  
    close(fd);  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值