创建子进程

如何创建进程?

C语言在unistd.h定义了如下函数:

1
2
3
4
5
6
7
8
9
10
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);
int execlp(const char *file, const char *arg, ...
/* (char *) NULL */);
int execle(const char *path, const char *arg, ...
/*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
  • 形式都是exec*
  • 必须带l或v,意思是参数的形式。l:参数是list的形式;v:参数是victor的形式。
  • p的意思是怎么找到可执行文件。不带p通过路径;带p除了通过路径,还可以在PATH环境变量里找(如不包含斜杠)。
  • e的意思是可以通过参数指定环境。

Python3有subprocess模块:

1
2
3
4
5
# subprocess替代老旧的os.system、os.spawn*
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)
# 返回值:subprocess.CompletedProcess

class subprocess.Popen(args, bufsize=- 1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=- 1, encoding=None, errors=None, text=None, pipesize=- 1)