C Library User 手册(24)

281 篇文章 16 订阅

10.25 unistd.h

<unistd.h> 头文件定义了尚未在其他头文件中定义或声明的符号常量和结构。

int access(const char *path, int mode); [POSIX]
unsigned int alarm (unsigned int seconds); [POSIX]
char * getcwd(char *buf, size_t size); [POSIX]
pid_t getpid(void); [POSIX]
char * getwd(char *path_name); [POSIX]
int isatty(int fd); [POSIX]
void swab(const void *src, void *dest, size_t len); [POSIX]
long int sysconf(int name); [POSIX]
int unlink(const char *path); [POSIX]
extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;
int getopt(int argc, char * const argv[], const char *optstring);[POSIX]

10.25.1 access

int access(const char *path, int mode); [POSIX]

access 函数检查由 path 命名的文件的可访问性,以获得由 mode 指示的访问权限。 mode 的值是要检查的访问权限(R_OK 表示读取权限,W_OK 表示写入权限,X_OK 表示执行/搜索权限)或存在性测试 F_OK 的按位或。 检查路径名路径的所有组件的访问权限(包括 F_OK)。

注意 
    当 Hexagon 独立程序在 Windows 操作系统上运行的模拟器上执行时,由于 Windows 平台的限制,不支持检查 X_OK。

使用真实用户ID代替有效用户ID,使用真实组访问列表(包括真实组ID)代替有效ID来验证权限。

如果进程具有超级用户权限并指示 R_OK 或 W_OK 成功,则该文件实际上可能没有设置读取或写入权限位。 如果进程具有超级用户权限并指示 X_OK 成功,则至少设置用户、组或其他执行位之一。 (但是,该文件可能仍然无法执行。)

如果找不到路径或任何所需的访问模式都不会被授予,则返回 -1 值; 否则返回 0 值。

10.25.2 alarm

unsigned int alarm(unsigned int seconds); [POSIX]

报警函数设置一个定时器,在调用报警数秒后将信号 SIGALRM 传递给调用进程。 如果已经设置了警报但尚未发送警报,则另一个警报呼叫将取代先前的呼叫。 请求alarm(0) 使当前警报无效,并且不会传递信号SIGALRM。 允许的最大秒数为 2,147,483,647。

alarm 的返回值是从上一次调用 alarm 后计时器上剩余的时间量。 如果当前没有设置闹钟,则返回值为 0。如果设置定时器出错,则闹钟返回 ((unsigned int) -1)。

10.25.3 getcwd

char *getcwd(char *buf, size_t size); [POSIX]

getcwd 函数将当前工作目录的绝对路径名复制到 buf 引用的内存中,并返回一个指向 buf 的指针。 size 参数是 buf 引用的数组的大小(以字节为单位)。

如果 buf 为 NULL,则根据需要分配空间来存储路径名。 这个空间以后可能会被free释放。

成功完成后,将返回指向路径名的指针。 否则返回 NULL 指针并设置全局变量 errno 以指示错误。 此外,getwd 将与 errno 关联的错误消息复制到 buf 引用的内存中。

10.25.4 getopt

extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;

int getopt(int argc, char * const argv[], const char *optstring);[POSIX]

getopt 函数增量解析命令行参数列表 argv 并返回下一个已知选项字符。 如果已在接受的选项字符字符串 optstring 中指定了选项字符,则该选项字符是已知的。

选项字符串 optstring 可以包含以下元素:单个字符,以及后跟冒号的字符,以指示后面是选项参数。 例如,选项字符串“x”识别选项“-x”,选项字符串“x:”识别选项和参数“-x 参数”。 如果后面的参数有前导空格,getopt 并不重要。

从 getopt 返回时,optarg 指向一个选项参数(如果预期),并且变量 optind 包含指向下一个 argv 参数的索引,以便随后调用 getopt。 变量 optopt 保存返回的最后一个已知选项字符。

变量 opterr 和 optind 都初始化为 1。 optind 变量可以在一组调用 getopt 之前设置为另一个值,以便跳过更多或更少的 argv 条目。

要使用 getopt 评估多组参数,或多次评估单组参数,变量 optreset 必须在第二次和每组额外调用 getopt 之前设置为 1,并且必须重新初始化变量 optind .

当参数列表用完时,getopt 函数返回 -1。 参数列表中选项的解释可能会被选项 --(双破折号)取消,这会导致 getopt 发出参数处理结束的信号并返回 -1。 当所有选项都已处理完毕(即,直到第一个非选项参数),getopt 返回 -1。

getopt 函数返回 optstring 中的下一个已知选项字符。 如果 getopt 遇到 optstring 中未找到的字符或检测到缺少选项参数,则返回“?” (问号)。 如果 optstring 有一个前导“:”,则缺少选项参数会导致返回“:”而不是“?”。 在任何一种情况下,变量 optopt 都设置为导致错误的字符。 当参数列表用完时,getopt 函数返回 -1。

Example:
extern char *optarg;
extern int optind;
int bflag, ch, fd;
bflag = 0;
while ((ch = getopt(argc, argv, "bf:")) != -1) {
	switch (ch) {
		case 'b':
			bflag = 1;
			break;
		case 'f':
			if ((fd = open(optarg, O_RDONLY, 0)) < 0) {
				(void)fprintf(stderr,
					"myname: %s: %s\n", optarg, strerror(errno));
				exit(1);
			}
			break;
		case '?':
		default:
			usage();
	}
}
argc -= optind;
argv += optind;

如果 getopt 函数遇到字符串 optstring 中未找到的字符或检测到缺少选项参数,它会向 stderr 写入错误消息并返回“?”。 将 opterr 设置为零会禁用这些错误消息。 如果 optstring 有一个前导“:”,则缺少选项参数会导致返回一个“:”,除了抑制任何错误消息。

选项参数允许以“-”开头; 这是合理的,但会减少可能的错误检查量。

BUGS
曾经指定 getopt 函数返回 EOF 而不是 -1。

IEEE Std 改变了这一点。 1003.2-1992 (“POSIX.2”) 将 getopt 与 <stdio.h> 分离。

可以将单个破折号(“-”)指定为 optstring 中的字符,但它不应该有与之关联的参数。 这允许 getopt 与期望“-”作为选项标志的程序一起使用。

这种做法是错误的,不应在当前的任何开发中使用。 它仅用于向后兼容。 应注意不要使用“-”作为 optstring 中的第一个字符,以避免与 GNU getopt 的语义冲突,后者为以“-”开头的 optstring 分配不同的含义。 默认情况下,单个破折号会导致 getopt 返回 -1。

也可以将数字作为选项字母处理。 这允许 getopt 与期望数字(“-3”)作为选项的程序一起使用。 这种做法是错误的,不应在当前的任何开发中使用。 提供它只是为了向后兼容。 以下代码片段在大多数情况下都有效。

int ch;
long length;
char *p;
while ((ch = getopt(argc, argv, "0123456789")) != -1) {
    switch (ch) {
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':
            p = argv[optind - 1];
            if (p[0] == '-' && p[1] == ch && !p[2])
                length = ch - '0';
            else
                length = strtol(argv[optind] + 1, NULL, 10);
            break;
    }
}

10.25.5 getpid

pid_t getpid(void); [POSIX]

getpid 返回调用进程的进程 ID。 ID 保证是唯一的,并且对于构建临时文件名很有用。

注意 
    在独立模式下编译程序时,没有作业控制。  当调用 getpid 例程时,返回值将是程序正在执行的线程号。

10.25.6 getwd

char *getwd(char *path_name); [POSIX]

函数 getwd 是一个兼容性例程,它使用其 buf 参数和 MAXPATHLEN 的大小(在包含文件 <sys/param.h> 中定义)调用 getcwd。 显然,buf 的长度至少应为 MAXPATHLEN 个字节。

程序传统上使用这些例程来保存工作目录的名称,以便返回到它。 完成此操作的一个更快且更不容易出错的方法是打开当前目录 (.) 并使用 fchdir 函数返回。

成功完成后,将返回指向路径名的指针。 否则返回 NULL 指针并设置全局变量 errno 以指示错误。 此外,getwd 将与 errno 关联的错误消息复制到 buf 引用的内存中。

由于 getwd 不知道提供的缓冲区的长度,因此很长(但有效)的路径可能会溢出缓冲区并为攻击者提供利用调用者的手段。 应使用 getcwd 代替 getwd(后者仅出于兼容性目的而提供)。

10.25.7 isatty

int isatty(int fd); [POSIX]

isatty 函数确定文件描述符 fd 是否引用有效的终端类型设备。
如果 fd 与终端设备相关联, isatty 函数返回 1; 否则返回 0 并设置 errno 以指示错误。

10.25.8 swab

void swab(const void *src, void *dest, size_t len); [POSIX]

swab 函数将 len 个字节从 src 引用的位置复制到 dest 引用的位置,交换相邻字节。 参数 len 必须是偶数。

10.25.9 sysconf

long int sysconf(int name); [POSIX]

sysconf 函数为应用程序提供了一种方法来确定可配置系统限制或选项变量的当前值。 name 参数指定要查询的系统变量。 每个名称值的符号常量可在包含文件 <unistd.h> 中找到。

可用值如下:

表 10-12 sysconf() 值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果对 sysconf 的调用不成功,则返回 -1 并适当设置 errno。否则,如果变量与不受支持的功能相关联,则返回 -1 并且不修改 errno。 否则,返回当前变量值。

10.25.10 unlink

int unlink(const char *path); [POSIX]

unlink 函数删除一个文件的链接。 如果 path 命名符号链接,则 unlink 删除符号链接并且不影响由符号链接的内容命名的任何文件或目录。 否则, unlink 会删除 path 命名的链接,并减少链接引用的文件的链接计数。

当文件的链接计数变为 0 且没有进程打开该文件时,该文件占用的空间将被释放,该文件不再可访问。 如果一个或多个进程在删除最后一个链接时打开了文件,则在取消链接返回之前删除链接,但文件内容的删除将推迟到对文件的所有引用都关闭为止。

除非进程具有适当的权限并且实现支持在目录上使用取消链接,否则路径参数不得命名目录。

成功完成后,取消链接标记以更新父目录的 st_ctime 和 st_mtime 字段。 如果文件的链接计数不为 0,则将文件的 st_ctime 字段标记为更新。 成功完成后,返回 0。 否则,返回 -1,设置 errno 以指示错误,并且文件未取消链接。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值