linux内核错误返回值ERRNO

#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H

#define	EPERM		 1	/* Operation not permitted */
#define	ENOENT		 2	/* No such file or directory */
#define	ESRCH		 3	/* No such process */
#define	EINTR		 4	/* Interrupted system call */
#define	EIO		 	 5	/* I/O error */
#define	ENXIO		 6	/* No such device or address */
#define	E2BIG		 7	/* Argument list too long */
#define	ENOEXEC		 8	/* Exec format error */
#define	EBADF		 9	/* Bad file number */
#define	ECHILD		10	/* No child processes */
#define	EAGAIN		11	/* Try again */
#define	ENOMEM		12	/* Out of memory */
#define	EACCES		13	/* Permission denied */
#define	EFAULT		14	/* Bad address */
#define	ENOTBLK		15	/* Block device required */
#define	EBUSY		16	/* Device or resource busy */
#define	EEXIST		17	/* File exists */
#define	EXDEV		18	/* Cross-device link */
#define	ENODEV		19	/* No such device */
#define	ENOTDIR		20	/* Not a directory */
#define	EISDIR		21	/* Is a directory */
#define	EINVAL		22	/* Invalid argument */
#define	ENFILE		23	/* File table overflow */
#define	EMFILE		24	/* Too many open files */
#define	ENOTTY		25	/* Not a typewriter */
#define	ETXTBSY		26	/* Text file busy */
#define	EFBIG		27	/* File too large */
#define	ENOSPC		28	/* No space left on device */
#define	ESPIPE		29	/* Illegal seek */
#define	EROFS		30	/* Read-only file system */
#define	EMLINK		31	/* Too many links */
#define	EPIPE		32	/* Broken pipe */
#define	EDOM		33	/* Math argument out of domain of func */
#define	ERANGE		34	/* Math result not representable */

#endif

该代码位于: linux源码/include/asm-generic/Errno-base.h
注:使用这些宏作为返回值时,要加上负号-

`getcwd` 函数实现的主要思路是从当前工作目录开始,一直遍历到根目录,将路径中的每一级目录名依次记录下来,最终拼接成完整路径。 以下是一个简单的示例代码,可以实现类似 `getcwd` 的功能: ```c #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <limits.h> #define PATH_MAX_LEN 4096 char *getcwd(char *buf, size_t size) { char *cwd; char *path = NULL; size_t len = PATH_MAX_LEN; int err = 0; if (buf == NULL) { path = malloc(len); if (path == NULL) { errno = ENOMEM; return NULL; } } else { path = buf; len = size; } while (1) { cwd = getcwd(path, len); if (cwd == NULL) { err = errno; if (err == ERANGE && len < PATH_MAX_LEN * 16) { len *= 2; path = realloc(path, len); if (path == NULL) { err = ENOMEM; break; } } else { break; } } else { break; } } if (err != 0) { errno = err; if (buf == NULL) { free(path); } return NULL; } if (strlen(path) >= len) { errno = ERANGE; if (buf == NULL) { free(path); } return NULL; } if (buf == NULL) { return path; } else { strncpy(buf, path, size); if (size > 0) { buf[size - 1] = '\0'; } return buf; } } ``` 该实现使用了 `getcwd` 函数获取当前工作目录,如果返回值为 `NULL`,则根据错误码进行相应的处理。如果返回值不为 `NULL`,则将当前目录名拼接到路径中。 需要注意的是,由于在使用 `getcwd` 函数时需要传入缓冲区的大小,因此在实现 `getcwd` 函数时也需要处理缓冲区溢出的情况。在本例中,如果缓冲区大小不足,则会自动扩大缓冲区的大小,直到能够容纳整个路径为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值