per quanto riguarda la chiamata: quella è sì bloccante ma esistono nello stesso modulo chiamate non bloccanti per processamenti in parallelo. mi sono documentato un pò aprendo le api c di windows.
l'msdn in riferimento alle api di windows dice che (sperando di non infrangere copyright vari):
_spawnl, _wspawnl
Create and execute a new process.
int _spawnl( int mode, const char *cmdname, const char *arg0, const char *arg1, ... const char *argn, NULL );
int _wspawnl( int mode, const wchar_t *cmdname, const wchar_t *arg0, const wchar_t *arg1, ... const wchar_t *argn, NULL );
Routine Required Header Compatibility
_spawnl <process.h> Win 95, Win NT
_wspawnl <stdio.h> or <wchar.h> Win NT
For additional compatibility information, see Compatibility in the Introduction.
Libraries
LIBC.LIB Single thread static library, retail version
LIBCMT.LIB Multithread static library, retail version
MSVCRT.LIB Import library for MSVCRT.DLL, retail version
Return Value
The return value from a synchronous _spawnl or _wspawnl (_P_WAIT specified for mode) is the exit status of the new process. The return value from an asynchronous _spawnl or _wspawnl (_P_NOWAIT or _P_NOWAITO specified for mode) is the process handle. The exit status is 0 if the process terminated normally. You can set the exit status to a nonzero value if the spawned process specifically calls the exit routine with a nonzero argument. If the new process did not explicitly set a positive exit status, a positive exit status indicates an abnormal exit with an abort or an interrupt. A return value of –1 indicates an error (the new process is not started). In this case, errno is set to one of the following values:
E2BIG
Argument list exceeds 1024 bytes
EINVAL
mode argument is invalid
ENOENT
File or path is not found
ENOEXEC
Specified file is not executable or has invalid executable-file format
ENOMEM
Not enough memory is available to execute new process
Parameters
mode
Execution mode for calling process
cmdname
Path of file to be executed
arg0, ... argn
List of pointers to arguments
Remarks
Each of these functions creates and executes a new process, passing each command-line argument as a separate parameter.
Process and Environment Control Routines | _spawn Functions Overview
See Also abort, atexit, _exec Functions, exit, _flushall, _getmbcp, _onexit, _setmbcp, system
Example
/* SPAWN.C: This program accepts a number in the range
* 1-8 from the command line. Based on the number it receives,
* it executes one of the eight different procedures that
* spawn the process named child. For some of these procedures,
* the CHILD.EXE file must be in the same directory; for
* others, it only has to be in the same path.
*/
#include <stdio.h>
#include <process.h>
char *my_env[] =
{
"THIS=environment will be",
"PASSED=to child.exe by the",
"_SPAWNLE=and",
"_SPAWNLPE=and",
"_SPAWNVE=and",
"_SPAWNVPE=functions",
NULL
};
void main( int argc, char *argv[] )
{
char *args[4];
/* Set up parameters to be sent: */
args[0] = "child";
args[1] = "spawn??";
args[2] = "two";
args[3] = NULL;
if (argc <= 2)
{
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
switch (argv[1][0]) /* Based on first letter of argument */
{
case '1':
_spawnl( _P_WAIT, argv[2], argv[2], "_spawnl", "two", NULL );
break;
case '2':
_spawnle( _P_WAIT, argv[2], argv[2], "_spawnle", "two",
NULL, my_env );
break;
case '3':
_spawnlp( _P_WAIT, argv[2], argv[2], "_spawnlp", "two", NULL );
break;
case '4':
_spawnlpe( _P_WAIT, argv[2], argv[2], "_spawnlpe", "two",
NULL, my_env );
break;
case '5':
_spawnv( _P_OVERLAY, argv[2], args );
break;
case '6':
_spawnve( _P_OVERLAY, argv[2], args, my_env );
break;
case '7':
_spawnvp( _P_OVERLAY, argv[2], args );
break;
case '8':
_spawnvpe( _P_OVERLAY, argv[2], args, my_env );
break;
default:
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
printf( "from SPAWN!\n" );
}
Output
SYNTAX: SPAWN <1-8> <childprogram>
in riferimento a spawn e simili la documentazione python dice che sono state rimpiazzate da Popen:
http://docs.python.org/lib/node538.html in particolare pare che per lanciare un nuovo
processo in maniera
asincrona occorra usare:
quindi se non fanno casino tra iò che è thread e ciò che è processo Popen (in una della sue varianti) dovrebbe essere ok!
M