当前位置: 首页 > news >正文

专业做汽车零部件平台的网站wordpress 附件 文件夹

专业做汽车零部件平台的网站,wordpress 附件 文件夹,常州本地做网站的大公司,挖掘关键词爱站网文章目录 flock函数描述返回值和错误码笔记 fcntl函数描述复制文件描述符文件描述标志文件状态标志 咨询锁强制锁管理信号租赁文件和目录变更通知改变管道容量 返回值错误备注遗留问题 flock函数 主要功能是在已打开的文件应用或者删除共享锁或者独占锁。sys/file.h声明了这个… 文章目录 flock函数描述返回值和错误码笔记 fcntl函数描述复制文件描述符文件描述标志文件状态标志 咨询锁强制锁管理信号租赁文件和目录变更通知改变管道容量 返回值错误备注遗留问题 flock函数 主要功能是在已打开的文件应用或者删除共享锁或者独占锁。sys/file.h声明了这个函数声明的原型是int flock(int fd, int operation)。 描述 fd是文件描述符。operation可以是下列参数之一 LOCK_SH放置共享锁。多个进程可能在给定时间持有给定文件的共享锁。LOCK_EX 放置独占锁。在给定时间只有一个进程可以持有给定文件的排他锁。LOCK_UN删除此进程持有的现有锁。 如果另一个进程持有不兼容的锁则对 freeze() 的调用可能会阻塞。要发出非阻塞请求请在上述任何操作中包含 LOCK_NB通过 ORing。 单个文件不能同时拥有共享锁和排它锁。 由flock()创建的锁与打开的文件表条目相关联。这意味着重复的文件描述符例如由 fork 或 dup 创建的引用相同的锁并且可以使用这些描述符中的任何一个来修改或释放该锁。此外锁可以通过对任何这些重复描述符执行显式 LOCK_UN 操作来释放或者当所有此类描述符都已关闭时释放。 如果进程使用 open 或类似的来获取同一文件的多个描述符则这些描述符将由 flock() 独立处理。使用这些文件描述符之一锁定文件的尝试可能会被调用进程已经通过另一个描述符放置的锁拒绝。 进程只能在文件上持有一种类型的锁共享或独占。后续对已锁定文件的flock() 调用会将现有锁定转换为新的锁定模式。 由flock() 创建的锁在execve 中保留。 无论文件打开的模式如何都可以对文件放置共享锁或独占锁。 返回值和错误码 成功后返回零。出错时返回 -1并适当设置 errno。EBADFfd 不是打开的文件描述符。EINTR在等待获取锁时调用被处理程序捕获的信号的传递中断参见信号signals相关文档。EINVAL操作无效。ENOLCK内核内存不足无法分配锁定记录。EWOULDBLOCK文件被锁定并选择了 LOCK_NB 标志。 笔记 flock() 调用首次出现在BSD4.2中。在大多数 UNIX 系统上都出现了一个 flock() 版本可能是根据 fcntl() 实现的。flock() 不会锁定 NFS 上的文件。使用 fcntl() 代替。如果 Linux 版本足够新并且服务器支持锁定它确实可以通过 NFS 工作。从内核 2.0 开始flock() 本身被实现为系统调用而不是在 GNU C 库中模拟为对 fcntl() 的调用。这产生了真正的BSD语义flock()和fcntl()放置的锁类型之间没有交互并且flock()不检测死锁。flock() 放置的锁不具有强约束力。实现了协议的软件才支持比如SSH和PUTTY。它给定文件的适当权限进程可以自由地忽略flock()的使用并在文件上执行I/O。对于fork()进程和dup()flock() 和 fcntl() 锁具有不同的语义。在使用fcntl() 实现flock() 的系统上flock() 的语义将与Linux手册中描述的语义不同。转换锁共享锁到独占锁或反之亦然不保证是原子线程安全的首先删除现有锁然后建立新锁。在这两个步骤之间可能会授予另一个进程的挂起锁定请求结果是转换要么阻塞要么在指定 LOCK_NB 的情况下失败。 这是原始的 BSD 行为并且发生在许多其他实现中。 fcntl函数 操作文件描述符的函数。两个头文件须引入 #include unistd.h #include fcntl.h函数的声明原型是int fcntl(int fd, int cmd, ... /* arg */ ); 描述 fcntl() 对打开的文件描述符 fd 执行各种操作。fcntl() 可以采用可选的第三个参数。操作指令由cmd决定操作内容因硬件的差异而不同。是否需要此参数由 cmd 决定。所需的参数类型在每个 cmd 名称后面的括号中指示大多数情况下所需的类型是 int我们使用名称 arg 来标识参数如果不需要参数则指定 void。 复制文件描述符 F_DUPFD找到大于或等于arg的最小编号的可用文件描述符并将其作为fd的副本。这与 dup2 不同后者完全使用指定的描述符。有关dup2()的差异请查看相关文档。成功后将返回新的描述符。F_DUPFD_CLOEXEC与 F_DUPFD 一样还为重复描述符设置 close-on-exec 标志。指定此标志允许程序避免额外的 fcntl() F_SETFD 操作来设置 FD_CLOEXEC 标志。有关此标志为何有用的说明请参阅 open() 中 O_CLOEXEC 的描述。 文件描述标志 以下命令操作与文件描述符关联的标志。目前只定义了一个这样的标志FD_CLOEXECclose-on-exec 标志。如果 FD_CLOEXEC 位为 0文件描述符将在 execve() 期间保持打开状态否则将被关闭。 F_GETFD读取文件描述符标志 arg 被忽略。F_SETFD将文件描述符标志设置为 arg 指定的值。 文件状态标志 每个打开的文件描述都有某些关联的状态标志由 open() 初始化并可能由 fcntl() 修改。重复的文件描述符使用 dup()、fcntl(F_DUPFD)、fork() 等创建引用相同的打开文件描述因此共享相同的文件状态标志。文件状态标志及其语义在 open() 相关文档中有描述。 F_GETFL获取文件访问模式和文件状态标志 arg 被忽略。F_SETFL将文件状态标志设置为 arg 指定的值。 arg 中的文件访问模式O_RDONLY、O_WRONLY、O_RDWR和文件创建标志即 O_CREAT、O_EXCL、O_NOCTTY、O_TRUNC将被忽略。在 Linux 上此命令只能更改 O_APPEND、O_ASYNC、O_DIRECT、O_NOATIME 和 O_NONBLOCK 标志。 咨询锁 主要用于flock()函数。F_GETLK、F_SETLK 和 F_SETLKW 用于获取、释放和测试记录锁也称为文件段锁或文件区域锁是否存在。第三个参数 lock 是一个指向结构的指针该结构至少具有以下字段按未指定的顺序。 struct flock {...short l_type; /* Type of lock: F_RDLCK,F_WRLCK, F_UNLCK */short l_whence; /* How to interpret l_start:SEEK_SET, SEEK_CUR, SEEK_END */off_t l_start; /* Starting offset for lock */off_t l_len; /* Number of bytes to lock */pid_t l_pid; /* PID of process blocking our lock(F_GETLK only) */... };该结构的 l_whence、l_start 和 l_len 字段指定我们希望锁定的字节范围。文件末尾之后的字节可能会被锁定但文件开头之前的字节不会被锁定。 l_start 是锁的起始偏移量并相对于以下任一位置进行解释 文件的开头如果 l_whence 为 SEEK_SET当前文件偏移量如果 l_whence 为 SEEK_CUR或文件末尾如果 l_whence 为 SEEK_END。在最后两种情况下l_start 可以是负数前提是偏移量不在文件开头之前。 l_len 指定要锁定的字节数。如果l_len为正数则要锁定的范围涵盖字节l_start直到l_startl_len-1包括l_startl_len-1。为 l_len 指定 0 具有特殊含义锁定从 l_whence 和 l_start 指定的位置开始到文件末尾的所有字节无论文件增长多大。 POSIX.1-2001 允许但不要求实现支持负 l_len 值如果 l_len 为负数则 lock 描述的间隔涵盖字节 l_startl_len 直至包括 l_start-1。 Linux 从内核版本 2.4.21 和 2.5.49 开始支持这一点。 l_type 字段可用于在文件上放置读 (F_RDLCK) 或写 (F_WRLCK) 锁。任意数量的进程都可以在一个文件区域上持有读锁共享锁但只有一个进程可以持有写锁独占锁。独占锁排除所有其他锁包括共享锁和独占锁。单个进程只能在文件区域上持有一种类型的锁如果将新锁应用于已锁定区域则现有锁将转换为新锁类型。 如果新锁指定的字节范围与现有锁的范围不完全一致则此类转换可能涉及拆分、收缩或与现有锁合并。 F_SETLK (struct flock *) 对lock的l_whence、l_start和l_len字段指定的字节获取锁当l_type为F_RDLCK或F_WRLCK时或释放锁当l_type为F_UNLCK时。如果冲突的锁被另一个进程持有则此调用返回 -1 并将 errno 设置为 EACCES 或 EAGAIN。 F_SETLKW (struct flock *) 与 F_SETLK 一样但如果文件上持有冲突锁则等待该锁被释放。如果在等待时捕获到信号则调用将被中断并在信号处理程序返回后立即返回返回值 -1 且 errno 设置为 EINTR请查阅 signal()。 F_GETLK (struct flock *) 在输入此调用时lock 描述了我们想要在文件上放置的锁。如果可以放置锁则 fcntl() 实际上不会放置它而是在 lock 的 l_type 字段中返回 F_UNLCK 并保持结构的其他字段不变。如果一个或多个不兼容的锁会阻止放置此锁则 fcntl() 将在 lock 的 l_type、l_whence、l_start 和 l_len 字段中返回有关这些锁之一的详细信息并将 l_pid 设置为持有该锁的进程的 PID 。 为了放置读锁fd 必须打开以供读取。为了放置写锁fd 必须打开以进行写入。要放置两种类型的锁请以读写方式打开文件。 除了通过显式 F_UNLCK 删除记录锁之外当进程终止或关闭任何引用持有锁的文件的文件描述符时记录锁也会自动释放。这很糟糕这意味着当由于某种原因库函数决定打开、读取和关闭文件例如 /etc/passwd 或 /etc/mtab时进程可能会失去对文件的锁定。 记录锁不会由通过 fork() 创建的子进程继承而是在 execve() 中保留。由于 stdio 库执行缓冲因此应避免在该包中的例程中使用记录锁定使用 read() 和 write() 代替。 强制锁 本章不符合POSIX规范。上述记录锁可以是建议性的也可以是强制的并且默认情况下是建议性的。咨询锁不强制执行仅在协作进程之间有用。对所有进程强制执行强制锁。如果进程尝试对具有不兼容强制锁的文件区域执行不兼容访问例如read() 或 write()则结果取决于是否为其打开的文件描述启用了 O_NONBLOCK 标志。如果未启用 O_NONBLOCK 标志则系统调用将被阻止直到锁被移除或转换为与访问兼容的模式。如果启用了 O_NONBLOCK 标志则系统调用将失败并出现错误 EAGAIN。 要使用强制锁定必须在包含要锁定的文件的文件系统和文件本身上启用强制锁定。使用 mount() 的“-o mand”选项或 mount() 的 MS_MANDLOCK 标志在文件系统上启用强制锁定。通过禁用文件的组执行权限并启用 set-group-ID 权限位请参阅 chmod() 和 chmod()可以对文件启用强制锁定。Linux 的强制锁定实现是不可靠的。请参阅下文详细说明的错误。 管理信号 F_GETOWN、F_SETOWN、F_GETOWN_EX、F_SETOWN_EX、F_GETSIG 和 F_SETSIG 用于管理 I/O 可用性信号。 F_GETOWN (void) 返回作为函数结果当前接收文件描述符 fd 上事件的 SIGIO 和 SIGURG 信号的进程 ID 或进程组。进程 ID 以正值形式返回进程组 ID 作为负值返回但请参阅下面的错误。 arg 被忽略。 F_SETOWN (int) 将文件描述符 fd 上的事件接收 SIGIO 和 SIGURG 信号的进程 ID 或进程组 ID 设置为 arg 中给定的 ID。进程ID指定为正值进程组 ID 指定为负值。最常见的是调用进程将自身指定为所有者即 arg 指定为 getpid()。 如果使用 fcntl() 的 F_SETFL 命令在文件描述符上设置 O_ASYNC 状态标志则只要该文件描述符上可以进行输入或输出就会发送 SIGIO 信号。 F_SETSIG 可用于获取 SIGIO 以外的信号传递。如果此权限检查失败则该信号将被默默丢弃。 向 F_SETOWN 指定的所有者进程组发送信号会受到与 Kill() 中所述相同的权限检查其中发送进程是使用 F_SETOWN 的进程但请参阅下面的错误。 如果文件描述符 fd 引用套接字则 F_SETOWN 还会选择当带外数据到达该套接字时传送的 SIGURG 信号的接收者。 SIGURG 在 select() 报告套接字有“异常情况”的任何情况下都会发送。 以下情况在 2.6.x 内核直至包括内核 2.6.11 中均成立 如果在使用支持线程组例如 NPTL的线程库运行的多线程进程中为 F_SETSIG 赋予非零值则为 F_SETOWN 赋予正值具有不同的含义而不是标识整个进程的进程 ID它是标识进程内特定线程的线程 ID。因此当使用 F_SETSIG 时可能需要将 gettid() 的结果而不是 getpid() 传递给 F_SETOWN 以获得合理的结果。 在当前的 Linux 线程实现中主线程的线程 ID 与其进程 ID 相同。这意味着单线程程序在这种情况下同样可以使用 gettid() 或 getpid()。但是请注意本段中的语句不适用于为套接字上的带外数据生成的 SIGURG 信号此信号始终发送到进程或进程组具体取决于为 F_SETOWN 指定的值。 上述行为在 Linux 2.6.12 中被意外删除并且不会恢复。 从 Linux 2.6.32 开始使用 F_SETOWN_EX 将 SIGIO 和 SIGURG 信号定位到特定线程。 F_GETOWN_EX (struct f_owner_ex *)内核2.6.32版本开始提供 返回由先前的 F_SETOWN_EX 操作定义的当前文件描述符所有者设置。信息在 arg 指向的结构中返回其形式如下 struct f_owner_ex {int type;pid_t pid; };类型字段将具有值 F_OWNER_TID、F_OWNER_PID 或 F_OWNER_PGRP 之一。 pid 字段是一个正整数表示线程 ID、进程 ID 或进程组 ID。有关详细信息请参阅 F_SETOWN_EX。 F_SETOWN_EX (struct f_owner_ex *) 内核2.6.32版本开始提供 此操作执行与 F_SETOWN 类似的任务。它允许调用者将 I/O 可用性信号定向到特定的线程、进程或进程组。调用者通过 arg 指定信号的目标arg 是指向 f_owner_ex 结构的指针。 type 字段具有以下值之一它们定义如何解释 pid F_OWNER_TID 将信号发送到 pid 中指定了线程 ID调用 clone() 或 gettid() 返回的值的线程。 F_OWNER_PID 向 pid 中指定 ID 的进程发送信号。 F_OWNER_PGRP 向pid中指定ID的进程组发送信号。 请注意与 F_SETOWN 不同此处将进程组 ID 指定为正值。 F_GETSIG (void) 返回作为函数结果当输入或输出成为可能时发送的信号。值为零表示发送了 SIGIO。任何其他值包括 SIGIO都是发送的信号在这种情况下如果与 SA_SIGINFO 一起安装则信号处理程序可以使用附加信息。 arg 被忽略。 F_SETSIG (int) 将输入或输出变为可能时发送的信号设置为 arg 中给定的值。值为零表示发送默认的 SIGIO 信号。任何其他值包括 SIGIO都是要发送的信号在这种情况下如果与 SA_SIGINFO 一起安装则信号处理程序可以使用附加信息。 通过使用具有非零值的 F_SETSIG并为信号处理程序设置 SA_SIGINFO请参阅 sigaction()有关 I/O 事件的额外信息将传递到 siginfo_t 结构中的处理程序。如果 si_code 字段指示源是 SI_SIGIO则 si_fd 字段给出与事件关联的文件描述符。否则没有指示哪些文件描述符正在挂起您应该使用常用的机制 select()、poll()、read() 和 O_NONBLOCK 设置等来确定哪些文件描述符可用于 I/O。 通过选择实时信号值 SIGRTMIN可以使用相同的信号编号对多个 I/O 事件进行排队。 排队取决于可用内存。如果为信号处理程序设置了 SA_SIGINFO则可获得额外信息如上所述。 请注意Linux 对可以排队到进程的实时信号数量施加了限制请参阅 getrlimit() 和 signal()如果达到此限制则内核将恢复传递 SIGIO并且这信号被传递到整个进程而不是特定的线程。 使用这些机制程序可以实现完全异步 I/O而无需在大多数情况下使用 select() 或 poll()。 O_ASYNC、F_GETOWN、F_SETOWN 的使用特定于 BSD 和 Linux。 F_GETOWN_EX、F_SETOWN_EX、F_GETSIG 和 F_SETSIG 是 Linux 特定的。 POSIX 有异步 I/O 和 aio_sigevent 结构来实现类似的事情这些也可以作为 GNU C 库 (Glibc) 的一部分在 Linux 中使用。 租赁 F_SETLEASE 和 F_GETLEASELinux 2.4 及以上版本分别用于在文件描述符 fd 引用的打开文件描述上建立新租约并检索当前租约。文件租约提供了一种机制当进程“租约破坏者”尝试open()或truncate()文件时持有租约的进程“租约持有者”会收到通知通过发送信号。该文件描述符引用的文件。 F_SETLEASE根据整数 arg 中指定的以下值设置或删除文件租约 F_RDLCK取出已读租约。这将导致调用进程在打开文件进行写入或被截断时收到通知。读租约只能放置在以只读方式打开的文件描述符上。F_WRLCK拿出写租约。这将导致调用者在打开文件进行读取或写入或被截断时收到通知。仅当该文件没有其他打开的文件描述符时才可以对该文件放置写租约。F_UNLCK从文件中删除我们的租约。 租约与打开的文件描述相关联请参阅 open()。这意味着重复的文件描述符例如由 fork() 或 dup()创建的引用相同的租约并且可以使用这些描述符中的任何一个来修改或释放该租约。此外通过对任何这些重复描述符执行显式 F_UNLCK 操作或者当所有此类描述符都已关闭时可以释放租约。 租赁只能在常规文件上进行。非特权进程只能对 UID所有者与该进程的文件系统 UID 匹配的文件进行租约。具有 CAP_LEASE 功能的进程可以获取任意文件的租约。 F_GETLEASE (void)通过返回 F_RDLCK、F_WRLCK 或 F_UNLCK 来指示与文件描述符 fd 关联的租约类型分别指示读租约、写租约或无租约。 arg 被忽略。 当进程“租约破坏者”执行与通过 F_SETLEASE 建立的租约冲突的 open() 或 truncate() 时系统调用将被内核阻止并且内核通过向租约持有者发送信号来通知租约持有者默认为 SIGIO。租约持有者应通过执行任何所需的清理操作来响应此信号的接收以准备文件被另一个进程访问例如刷新缓存的缓冲区然后删除或降级其租约。通过执行 F_SETLEASE 命令并将 arg 指定为 F_UNLCK 来删除租约。如果租约持有者当前持有该文件的写租约并且租约破坏者正在打开该文件进行读取则租约持有者将租约降级为读租约就足够了。这是通过执行 F_SETLEASE 命令并将 arg 指定为 F_RDLCK 来完成的。 如果租约持有者未能在 /proc/sys/fs/lease-break-time 中指定的秒数内降级或删除租约则内核将强制删除或降级租约持有者的租约。 一旦启动租约中断F_GETLEASE 将返回目标租约类型F_RDLCK 或 F_UNLCK具体取决于与租约中断器兼容的类型直到租约持有者自愿降级或删除租约或者内核在租约结束后强制执行此操作休息定时器到期。 一旦租约被自愿或强制删除或降级并且假设租约破坏者尚未解除其系统调用的阻塞内核将允许租约破坏者的系统调用继续进行。 如果租约中断器阻塞的 open() 或 truncate() 被信号处理程序中断则系统调用将失败并出现错误 EINTR但其他步骤仍然会发生如上所述。如果租约破坏者在 open() 或 truncate() 中被阻塞时被信号杀死则其他步骤仍然会发生如上所述。如果租约破坏者在调用 open() 时指定了 O_NONBLOCK 标志则调用会立即失败并出现错误 EWOULDBLOCK但其他步骤仍然会按照上面的描述进行。 用于通知租约持有者的默认信号是 SIGIO但可以使用 fcntl() 的 F_SETSIG 命令更改此信号。如果执行 F_SETSIG 命令即使指定 SIGIO并且使用 SA_SIGINFO 建立信号处理程序则处理程序将接收 siginfo_t 结构作为其第二个参数并且该参数的 si_fd 字段将保存租用文件的描述符已被另一个进程访问。 如果调用者持有多个文件的租约这非常有用。 文件和目录变更通知 F_NOTIFY (int)Linux 2.4 及以上当 fd 引用的目录或其包含的任何文件发生更改时提供通知。要通知的事件在 arg 中指定arg 是通过对以下零个或多个位进行或运算指定的位掩码 DN_ACCESS文件被访问read、pread、readvDN_MODIFY文件被修改write、pwrite、writev、truncate、ftruncate。DN_CREATE创建了一个文件open, creat, mknod, mkdir, link, symlink, rename。DN_DELETE文件被取消链接unlinkrename到另一个目录rmdir。DN_RENAME该目录中的文件被重命名重命名DN_ATTRIB文件的属性已更改chown、chmod、utime[s]。 为了获得这些定义必须在包含任何头文件之前定义 _GNU_SOURCE 功能测试宏。 一系列 F_NOTIFY 请求是累积的arg 中的事件被添加到已监视的集合中。要禁用所有事件的通知请进行 F_NOTIFY 调用并将 arg 指定为 0。 通知是通过信号的传递发生的。默认信号是 SIGIO但可以使用 fcntl() 的 F_SETSIG 命令进行更改。在后一种情况下信号处理程序接收 siginfo_t 结构作为其第二个参数如果处理程序是使用 SA_SIGINFO 建立的并且该结构的 si_fd 字段包含生成通知的文件描述符在多个目录上建立通知时有用。 特别是在使用 DN_MULTISHOT 时应该使用实时信号进行通知以便可以将多个通知排队。注意新应用程序应使用 inotify 接口自内核 2.6.13 起可用它提供了一个更高级的接口来获取文件系统事件的通知。请参阅 inotify 相关资料。 改变管道容量 F_SETPIPE_SZ (int);从Linux 2.6.35版本开始提供。将 fd 引用的管道的容量更改为至少为 arg 字节。非特权进程可以将管道容量调整为系统页面大小和 /proc/sys/fs/pipe-max-size 中定义的限制之间的任何值请参阅 proc()。尝试将管道容量设置为低于页面大小时会自动四舍五入到页面大小。非特权进程尝试将管道容量设置为高于 /proc/sys/fs/pipe-max-size 中的限制会产生错误 EPERM特权进程 (CAP_SYS_RESOURCE) 可以覆盖该限制。当为管道分配缓冲区时如果方便实现内核可以使用大于arg的容量。 F_GETPIPE_SZ 操作返回实际使用的大小。尝试将管道容量设置为小于当前用于存储数据的缓冲区空间量会产生错误 EBUSY。F_GETPIPE_SZ(void)从Linux 2.6.35版本开始提供。返回作为函数结果fd 引用的管道的容量。 返回值 对于成功的调用返回值取决于操作 F_DUPFD新的描述符。F_GETFD文件描述符标志的值。F_GETFL文件状态标志的值。F_GETLEASE文件描述符上持有的租约类型。F_GETOWN描述符所有者的值。F_GETSIG当可以进行读取或写入时发送的信号值或者对于传统的 SIGIO 行为为零。F_GETPIPE_SZ管道容量。所有其它命令0表示没有错误。出错时返回 -1并适当设置 errno。 错误 EACCES或EAGAIN操作被其他进程持有的锁禁止。EAGAIN该操作被禁止因为该文件已被另一个进程进行内存映射。EBADFfd 不是打开的文件描述符或者命令是 F_SETLK 或 F_SETLKW 并且文件描述符打开模式与请求的锁定类型不匹配。EDEADLK检测到指定的 F_SETLKW 命令会导致死锁。EFAULT锁位于您可访问的地址空间之外。EINTR对于F_SETLKW命令被信号中断参见signal相关资料。对于 F_GETLK 和 F_SETLK在检查或获取锁之前命令被信号中断。最有可能发生在锁定远程文件时例如通过 NFS 锁定但有时也可能发生在本地。EINVAL对于 F_DUPFDarg 为负数或大于最大允许值。对于 F_SETSIGarg 不是允许的信号号。EMFILE对于F_DUPFD进程已经打开了最大数量的文件描述符。ENOLCK打开太多段锁、锁表已满或远程锁定协议失败例如通过 NFS 锁定。EPERM尝试清除设置了仅附加属性的文件上的 O_APPEND 标志。 备注 SVr4、4.3BSD、POSIX.1-2001。 POSIX.1-2001 中仅指定了操作 F_DUPFD、F_GETFD、F_SETFD、F_GETFL、F_SETFL、F_GETLK、F_SETLK 和 F_SETLKW。F_GETOWN 和 F_SETOWN 在 POSIX.1-2001 中指定。 要获取它们的定义请使用 500 或更大的值定义 BSD_SOURCE 或 _XOPEN_SOURCE或者使用 200809L 或更大的值定义 _POSIX_C_SOURCE。F_DUPFD_CLOEXEC 在 POSIX.1-2008 中指定。 要获得此定义请将 _POSIX_C_SOURCE 定义为 200809L 或更大的值或者将 _XOPEN_SOURCE 定义为 700 或更大的值。F_GETOWN_EX、F_SETOWN_EX、F_SETPIPE_SZ、F_GETPIPE_SZ、F_GETSIG、F_SETSIG、F_NOTIFY、F_GETLEASE 和 F_SETLEASE 是 Linux 特定的。 定义 _GNU_SOURCE 宏来获取这些定义。最初的 Linux fcntl() 系统调用并不是为了处理大文件偏移量在集群结构中而设计的。因此Linux 2.4 中添加了 fcntl() 系统调用。较新的系统调用采用不同的文件锁定结构flock 和相应的命令 F_GETLK64、F_SETLK64 和 F_SETLKW64。然而使用 glibc 的应用程序可以忽略这些细节其 fcntl() 包装函数透明地使用可用的更新的系统调用。dup2 返回的错误与 F_DUPFD 返回的错误不同。从内核 2.0 开始flock() 和 fcntl() 放置的锁类型之间没有交互。一些系统在 structflock 中具有更多字段例如 l_sysid。显然如果持有锁的进程可能位于不同的机器上那么单独的 l_pid 不会很有用。 遗留问题 某些体系结构尤其是 i386上的 Linux 系统调用约定的限制意味着如果 F_GETOWN 返回的负进程组 ID 落在 -1 到 -4095 的范围内则返回值会被 glibc 错误地解释为系统调用出错也就是说fcntl() 的返回值为-1并且 errno 将包含正进程组 ID。 Linux 特有的 F_GETOWN_EX 操作避免了这个问题。从 glibc 2.11 版开始glibc 通过使用 F_GETOWN_EX 实现 F_GETOWN 来使内核 F_GETOWN 问题不可见。在 Linux 2.4 及更早版本中当非特权进程使用 F_SETOWN 将套接字文件描述符的所有者指定为调用者之外的进程组时可能会出现错误。在这种情况下fcntl() 可以返回 -1并将 errno 设置为 EPERM即使调用者有权向其发送信号的所有者进程组也是如此。尽管返回此错误但文件描述符所有者已设置并且信号将发送给所有者。所有已知版本的 Linux 中强制锁定的实现都受到竞争条件的影响这导致其不可靠与锁定重叠的 write() 调用可能会在获取强制锁定后修改数据与锁重叠的 read() 调用可能会检测仅在获取写锁后对数据所做的更改。强制锁和 mmap() 之间也存在类似的竞争。因此不建议依赖强制锁定。 作者岬淢箫声日期2023年11月3日版本1.0链接http://caowei.blog.csdn.net
http://www.zqtcl.cn/news/106691/

相关文章:

  • 网站建设与制作企业嘉鱼网站建设哪家专业
  • 电脑怎么做网站赚钱柳州柳北建设局网站
  • 农村服务建设有限公司网站设计基础网站推荐
  • 做网站的编程语言组合ppt模板免费的网站推荐
  • 泰安企业建站公司流程上海营销型网站报价
  • 网站承载量怎么做福州公交集团网站建设
  • 新吴区住房和建设交通局网站小程序商城哪家好排行榜
  • 中小学网站建站模板长春火车站咨询电话
  • c2c网站特点公司网站建设亚运村
  • 邢台wap网站建设费用黑帽seo之搜索引擎
  • 如何用阿里云做网站刷题网站怎么做
  • 织梦制作手机网站上海猎头公司名单
  • 免费生成图片的网站wordpress 购物
  • 江西建设部网站国际新闻最新消息今天2023
  • 怎么做网站啊wordpress英文显示改中文
  • 建筑专业网站有哪些网站标题seo外包优化
  • 浙江建设厅网站施工员报名中国建设协会官网站
  • 网站建设优化是干嘛上海今天最新的新闻
  • 网站大全浏览器软文的概念
  • 盐山做网站价格莱芜征婚吧
  • 具有品牌的微网站建设网站设计培训班前台
  • 网站推广工具推荐html网站地图在线生成
  • 成都本地网站建设青岛电子商务的网站建设
  • 北京网站开发培训河南省百城建设提质工程网站
  • 郑州专业建网站南通网站建设技术支持
  • 简约网站程序网络营销方式较为单一
  • 绍兴企业自助建站123房产网
  • 科技类网站设计特点备案 网站首页地址
  • 做兼职网站网站建设培训速成
  • 开源的网站管理系统商务网站设计与建设实训