标签:子进程 介绍 标记 for 复制文件 lag base str 空闲
close_on_exec是一个进程所有文件描述符的标记位图,每个比特位代表一个打开的文件描述符,用于确定在调用系统调用execve()时需要关闭的文件句柄 (参见include/fcntl.h)。
当一个程序使用fork()函数创建了一个子进程时,往往会在该子进程中调用execve()函数加载执行另一个新程序,此时子进程将完全被新程序替换掉,并在子进程中开始执行新程序。同时子进程会拷贝父进程的文件描述符表,这样父子进程就有可能同时操作同一打开文件,如果不想子进程操作该文件描述符,则可将close_on_exec中的对应比特位被设置为1,那么在执行execve()时该描述符将被关闭,否则该描述符将始终处于打开状态。当打开一个文件时,默认情况下文件句柄在子进程中也处于打开状态。设置相应标志位则需要fcntl系统调用,其使用介绍如下:
fcntl 系统调用
这个系统调用功能比较多,可以执行多种操作,其内核函数在fs/fcntl.c 中定义:
#include <fcntl.h >
int fcntl(int fildes , int cmd , ...);
man http://pubs.opengroup.org/onlinepubs/009695399/functions/fcntl.html
一 .参数:
二 .返回值:根据第二个参数的不同,这个返回值也不一样。
三 .函数功能:
示例代码:
#include <fcntl.h> #define PATTERN FD_CLOEXEC /* close_on_exec - set/clear close-on-exec flag */ int close_on_exec(int fd, int on) { int flags; if ((flags = fcntl(fd, F_GETFD, 0)) < 0) { printf("fcntl: get flags: %d", flags); return -1; } if (fcntl(fd, F_SETFD, on ? flags | PATTERN : flags & ~PATTERN) < 0) { printf("fcntl: set close-on-exec flag %s: %d", on ? "on" : "off", flags); return -1; } return ((flags & PATTERN) != 0); }
标签:子进程 介绍 标记 for 复制文件 lag base str 空闲
原文地址:https://www.cnblogs.com/ptfe/p/11060551.html