最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

posix

运维笔记admin26浏览0评论

posix

posix

 posix_spawn函数可用于替代fork/vfork+exec用于执行程序,同时提供比system函数更多的控制权

引入这个函数的原因主要有以下几点:

  • 调用fork绝大多数情况下是用于exec的,少数用于低效的并发进程创建(但并不适用于多线程程序,因为子进程只会fork当前线程,但会fork整个虚拟地址空间,其它线程的栈和资源都会复制过来,会导致资源泄露),以及daemon进程脱离父进程控制(使自己变为孤儿进程)等用途,调用vfork几乎一定是用于exec的(因为栈是和父进程共享的,只能进行一些操作以后exec或exit,不能从函数中返回)
  • fork/vfork+exec手写起来比较复杂,特别是vfork写起来有很多坑,比如共享stack和signal handler有损坏父进程执行上下文的可能性(所以提供一个模板用于调用)
  • 有些设备没有MMU,根本实现不了写时复制

当前Linux上是通过“分配stack+屏蔽所有信号+clone(CLONE_VM|CLONE_VFORK,stack)+exec”实现的,在FreeBSD上是用vfork+exec实现的,而在macOS上这个函数是一个系统调用

#include <spawn.h>int posix_spawn(pid_t *restrict pid, const char *restrict path,const posix_spawn_file_actions_t *restrict file_actions,const posix_spawnattr_t *restrict attrp,char *const argv[restrict],char *const envp[restrict]);
int posix_spawnp(pid_t *restrict pid, const char *restrict file,const posix_spawn_file_actions_t *restrict file_actions,const posix_spawnattr_t *restrict attrp,char *const argv[restrict],char *const envp[restrict]);

posix_spawn函数包括posix_spawn和posix_spawnp两个函数,都包括6个参数

第一个参数pid是一个输出参数,可以传入一个pid_t变量的地址,返回创建的pid,也可以是NULL表示不需要返回pid 

第二个参数path/file,对于posix_spawn,直接执行path路径指向的程序,对于posix_spawnp,如果file不包含/,则认为是一个命令,会搜索PATH环境变量

第三个参数file_actions,指向一个posix_spawn_file_actions_t对象,也可以是NULL表示继承所有没有设置fcntl(fd, SETFD, 1)的文件描述符,这个对象使用posix_spawn_file_actions_init初始化,使用*_destroy销毁,使用*_addopen添加打开文件操作,使用*_addclose添加关闭文件操作,使用*_adddup2添加复制文件描述符操作

第四个参数attrp,指向一个posix_spawnattr_t对象,也可以是NULL表示使用默认值,这个对象使用posix_spawnattr_init初始化,使用*_destroy销毁,使用*_setflags、*_setpgroup、*_setsigdefault、*_setsigmask等设置参数,其中*_setflags可以设置POSIX_SPAWN_RESETIDS、*_SETPGROUP、*_SETSIGMASK、*_SETSIGDEFAULT等(Linux、FreeBSD、macOS分别还有其它支持的参数,这里只列出了公共部分)

第五个参数argv,就是main函数的第二个参数char *argv[],其中argv[0]是命令名称,必须提供,数组最后一个元素一定要是NULL

第六个参数envp,就是main函数的第三个参数char *envp[]或全局变量extern char **environ;,数组最后一个元素一定要是NULL,这个参数也可以是NULL,表示没有环境变量

函数成功返回0,失败返回非0的errno错误码

参考:

posix_spawn(3) - Linux manual page (man7.org)

Mac OS X Manual Page For posix_spawn(2) (apple.com)

posix_spawn(3) [freebsd man page] (unix.com)

发布评论

评论列表(0)

  1. 暂无评论