C函数使用

1. access()

获取文件权限

#include <unistd.h>
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);
}

2. execl()

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

#include <process.h>	//windows
#include <unistd.h>		//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);

3. readlink()

#include <unistd.h>
//找出符号链接所指向的位置, 不能读取硬链接
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

3. snprintf()

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

#include <stdio.h>
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;
}

4. getrlimit()

获取或设置资源使用限制

#include <sys/resource.h>
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 )
{
}

4. _fmode

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

#include <stdlib.h>	
#include <fcntl.h>
_fmode = _O_BINARY;
_set_fmode( _O_BINARY );
errno_t _get_fmode(int * pmode);

5. signal()

#include <signal.h>
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);
}

  前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 

6. perror()

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

#include <stdio.h>
void perror ( const char * str );

perror( "cannot exec gdb" );

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

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

#include <unistd.h>
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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值