Browse Source

child_process: control argv0 for spawned processes

In some cases it useful to control the value of `argv[0]`, c.f.
 - https://github.com/andrewffff/child_process_with_argv0
 - https://github.com/andrep/argv0

This patch adds explicit support for setting the value of `argv[0]`
when spawning a process.

PR-URL: https://github.com/nodejs/node/pull/7696
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
v7.x
Pat Pannuto 9 years ago
committed by Anna Henningsen
parent
commit
99f45b2476
No known key found for this signature in database GPG Key ID: D8B9F5AEAE84E4CF
  1. 10
      doc/api/child_process.md
  2. 6
      lib/child_process.js
  3. 18
      test/parallel/test-child-process-spawn-argv0.js

10
doc/api/child_process.md

@ -295,6 +295,8 @@ added: v0.1.90
* `options` {Object} * `options` {Object}
* `cwd` {String} Current working directory of the child process * `cwd` {String} Current working directory of the child process
* `env` {Object} Environment key-value pairs * `env` {Object} Environment key-value pairs
* `argv0` {String} Explicitly set the value of `argv[0]` sent to the child
process. This will be set to `command` if not specified.
* `stdio` {Array|String} Child's stdio configuration. (See * `stdio` {Array|String} Child's stdio configuration. (See
[`options.stdio`][`stdio`]) [`options.stdio`][`stdio`])
* `detached` {Boolean} Prepare child to run independently of its parent * `detached` {Boolean} Prepare child to run independently of its parent
@ -397,6 +399,14 @@ child.on('error', (err) => {
}); });
``` ```
*Note: Certain platforms (OS X, Linux) will use the value of `argv[0]` for the
process title while others (Windows, SunOS) will use `command`.*
*Note: Node.js currently overwrites `argv[0]` with `process.execPath` on
startup, so `process.argv[0]` in a Node.js child process will not match the
`argv0` parameter passed to `spawn` from the parent, retrieve it with the
`process.argv0` property instead.*
#### options.detached #### options.detached
<!-- YAML <!-- YAML
added: v0.7.10 added: v0.7.10

6
lib/child_process.js

@ -351,7 +351,11 @@ function normalizeSpawnArguments(file /*, args, options*/) {
} }
} }
args.unshift(file); if (typeof options.argv0 === 'string') {
args.unshift(options.argv0);
} else {
args.unshift(file);
}
var env = options.env || process.env; var env = options.env || process.env;
var envPairs = []; var envPairs = [];

18
test/parallel/test-child-process-spawn-argv0.js

@ -0,0 +1,18 @@
'use strict';
require('../common');
const assert = require('assert');
const cp = require('child_process');
// This test spawns itself with an argument to indicate when it is a child to
// easily and portably print the value of argv[0]
if (process.argv[2] === 'child') {
console.log(process.argv0);
return;
}
const noArgv0 = cp.spawnSync(process.execPath, [__filename, 'child']);
assert.strictEqual(noArgv0.stdout.toString().trim(), process.execPath);
const withArgv0 = cp.spawnSync(process.execPath, [__filename, 'child'],
{argv0: 'withArgv0'});
assert.strictEqual(withArgv0.stdout.toString().trim(), 'withArgv0');
Loading…
Cancel
Save