• C函数使用


    1. access()

    获取文件权限

    #include 
    int access(const char *filenpath, int mode);
    mode:
    	R_OK:4 只判断是否有读权限
    	W_OK:2 只判断是否有写权限
    	X_OK:1 判断是否有执行权限
    	F_OK:0 只判断是否存在
    int file_exists(char *filename)
    {
    	return (access(filename, 0) == 0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2. execl()

    exec函数族成员函数:execl execle execlp execv execve execvp
    后缀"l"代表list也就是参数列表的意思,最后一个参数须用空指针NULL作结束

    #include 	//windows
    #include 		//Linux
    int execl(const char *path, const char *arg, ...);
    
    int main()
    {
    	printf("调用D盘Test目录下的hello.exe, 第一个参数为该应用程序的名称\n");
    	execl("D:\\Test\\hello.exe","hello");
    	printf("进程已经被递交给了hello.exe,这里不会再执行");
    }
    // 执行/bin目录下的ls, 第一参数为程序名ls, 第二个参数为"-al", 第三个参数为"/etc/passwd"
    execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3. readlink()

    #include 
    //找出符号链接所指向的位置, 不能读取硬链接
    ssize_t  readlink(const char *path, char *buf, size_t bufsiz);
    int link(const char *oldpath, const char *newpath);		//为oldpath文件建立一个硬链接
    int symlink(const char *oldpath, const char *newpath); //创建软链接
    int unlink(const char *pathname);	//删除软链接、硬链接、文件
    
    char exename[512];
    #if defined(__FreeBSD__)
        int len = readlink( "/proc/curproc/file", exename, sizeof( exename ) - 1 );
    #else
        int len = readlink( "/proc/self/exe", exename, sizeof( exename ) - 1 );
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3. snprintf()

    sscanf(scanf)、sprintf(printf)格式化
    将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。

    #include 
    int snprintf(char* dest_str,size_t size,const char* format,...);
    
    int main ()
    {
      char a[16];
      size_t i;
     
      i = snprintf(a, 13, "%012d", 12345);  // 第 1 种情况
      printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 000000012345
     
      i = snprintf(a, 9, "%012d", 12345);   // 第 2 种情况
      printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 00000001
     
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4. getrlimit()

    获取或设置资源使用限制

    #include 
    int getrlimit(int resource, struct rlimit *rlim); 
    int setrlimit(int resource, const struct rlimit *rlim);
    struct rlimit 
    {
      rlim_t rlim_cur;
      rlim_t rlim_max;
    };
    参数resource: 
    	RLIMIT_AS 		//进程的最大虚内存空间,字节为单位。
    	RLIMIT_CORE 	//内核转存文件的最大长度。
    	RLIMIT_CPU 		//最大允许的CPU使用时间,秒为单位。当进程达到软限制,内核将给其发送SIGXCPU信号,这一信号的默认行为是终止进程的执行。然而,可以捕捉信号,处理句柄可将控制返回给主程序。如果进程继续耗费CPU时间,核心会以每秒一次的频率给其发送SIGXCPU信号,直到达到硬限制,那时将给进程发送 SIGKILL信号终止其执行。
    	RLIMIT_DATA 	//进程数据段的最大值。
    	RLIMIT_FSIZE 	//进程可建立的文件的最大长度。如果进程试图超出这一限制时,核心会给其发送SIGXFSZ信号,默认情况下将终止进程的执行。
    	RLIMIT_LOCKS 	//进程可建立的锁和租赁的最大值。
    	RLIMIT_MEMLOCK 	//进程可锁定在内存中的最大数据量,字节为单位。
    	RLIMIT_MSGQUEUE //进程可为POSIX消息队列分配的最大字节数。
    	RLIMIT_NICE 	//进程可通过setpriority() 或 nice()调用设置的最大完美值。
    	RLIMIT_NOFILE 	//指定比进程可打开的最大文件描述词大一的值,超出此值,将会产生EMFILE错误。
    	RLIMIT_NPROC 	//用户可拥有的最大进程数。
    	RLIMIT_RTPRIO 	//进程可通过sched_setscheduler 和 sched_setparam设置的最大实时优先级。
    	RLIMIT_SIGPENDING //用户可拥有的最大挂起信号数。
    	RLIMIT_STACK 	//最大的进程堆栈,以字节为单位。
    返回值:
    	 0:成功执行时。
    	-1:失败,errno为:	EFAULT:rlim指针指向的空间不可访问
    						EINVAL:参数无效
    						EPERM :增加资源限制值时,权能不允许
    
    //例子
    struct rlimit rescLimit;
    if ( getrlimit( RLIMIT_NOFILE, &rescLimit ) == 0 )
    {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    4. _fmode

    _fmode 变量为文本或二进制转换设置默认文件转换模式。
    默认设置是适用于文本模式转换的 _O_TEXT。 _O_BINARY 是适用于二进制模式的设置。

    #include 	
    #include 
    _fmode = _O_BINARY;
    _set_fmode( _O_BINARY );
    errno_t _get_fmode(int * pmode);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5. signal()

    #include 
    typedef void (*__sighandler_t) (int);
    __sighandler_t signal (int __sig, __sighandler_t __handler);
    参数:
    	__sig    : 要捕捉的信号
    	__handler: 对信号进行的处理方式 SIG_IGN 忽略,SIG_DFL 默认处理动作,自定义函数
    	
    void handler_sign(int signal)
    {
        printf("catch a signal:%d\n", signal);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

      前31个为传统UNIX支持的信号,是不可靠信号(非实时的),后33个是后来扩充的,是可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。

    Linux下信号的定义:
     1) SIGHUP   	 2) SIGINT 		 3) SIGQUIT 		 4) SIGILL  	 5) SIGTRAP
     6) SIGABRT      7) SIGBUS       8) SIGFPE           9) SIGKILL  	10) SIGUSR1
    11) SIGSEGV		12) SIGUSR2 	13) SIGPIPE 		14) SIGALRM 	15) SIGTERM
    16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT         19) SIGSTOP     20) SIGTSTP
    21) SIGTTIN     22) SIGTTOU     23) SIGURG          24) SIGXCPU     25) SIGXFSZ
    26) SIGVTALRM   27) SIGPROF     28) SIGWINCH        29) SIGIO       30) SIGPWR
    31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1      36) SIGRTMIN+2  37) SIGRTMIN+3
    38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6      41) SIGRTMIN+7  42) SIGRTMIN+8
    43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11     46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14     51) SIGRTMAX-13 52) SIGRTMAX-12
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9      56) SIGRTMAX-8  57) SIGRTMAX-7
    58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4      61) SIGRTMAX-3  62) SIGRTMAX-2
    63) SIGRTMAX-1  64) SIGRTMAX 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6. perror()

    将上一个函数发生错误的原因输出到标准设备(stderr)。
    参数 str 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。

    #include 
    void perror ( const char * str );
    
    perror( "cannot exec gdb" );
    
    • 1
    • 2
    • 3
    • 4

    7、linux下获取程序所在目录

    getcw获取程序目录
    获取当前目录及文件名

    #include 
    main()
    {
        char buf[80];
        getcwd(buf, sizeof(buf));
        printf("current working directory : %s\n", buf);
        //调用 malloc 动态给 buf 分配,但要特别注意使用后释放缓冲,防止内存泄漏
        char *path = NULL;
        path = getcwd(NULL,0);
        puts(path);
        free(path);
        //不需考虑缓冲大小
        char *path;
        path = get_current_dir_name();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    Go Context包
    leetcode刷题记录
    操作系统 OS
    轿车5+1汽车变速器变速箱同步器操纵机构机械结构设计CAD汽车工程
    vue3中reactive对比ref watch watchEffect函数
    Nginx重写功能
    【华为OD题库-033】经典屏保-java
    使用JavaScript计算两点经纬度之间的弧线点经纬度数组
    测试时大量TIME_WAIT
    Opencv项目——信用卡数字识别Python代码实现
  • 原文地址:https://blog.csdn.net/pzs0221/article/details/127717767