Я просто переношу код в Mac OS X, который использует _tspawnl
в Windows.
Есть ли что-то эквивалентное _tspawnl
в Mac OS X или Linux?
Или есть ли какой-либо posix, эквивалентный _tspawnl
Вы можете использовать системный вызов fork
и execv
следующим образом:
if (!fork()){ // create the new process
execl(path, *arg, ...); // execute the new program
}
Системный вызов fork
создает новый процесс, а системный вызов execv
запускает выполнение приложения в пути. Например, вы можете использовать следующую функцию spawn
, аргументом которой является имя исполняемого приложения и список его аргументов.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int spawn (char* program, char** arg_list)
{
pid_t child_pid;
/* Duplicate this process. */
child_pid = fork ();
if (child_pid != 0)
/* This is the parent process. */
return child_pid;
else {
/* Now execute PROGRAM, searching for it in the path. */
execvp (program, arg_list);
/* The execvp function returns only if an error occurs. */
fprintf (stderr, "an error occurred in execvp\n");
abort ();
}
}
int main ()
{
/* The argument list to pass to the "ls" command. */
char* arg_list[] = {
"ls", /* argv[0], the name of the program. */
"-l",
"/",
NULL /* The argument list must end with a NULL. */
};
spawn ("ls", arg_list);
printf ("done with main program\n");
return 0;
}
Этот пример был взят из главы 3.2.2 этой книги. (Действительно хорошая ссылка для разработки в Linux).
Вы можете использовать fork()/exec()
, как уже указывалось, однако более близким системным вызовом является posix_spawn()
(manpage).
Однако может быть немного боль в настройке, но есть пример кода, который используется здесь (обратите внимание, что этот код также предоставляет функциональность для Windows с использованием API CreateProcess()
, который, вероятно, вы должны использовать под Windows в любом случае).
fork
будет порождать дочерний процесс. Но я хочу запустить новый процесс, заданный аргументом. Достаточно лиexecv
для моей цели?Fork
создает новый процесс, который является копией родительского процесса. Когдаexecv
вызывается, текущий образ процесса заменяется новым образом процесса. Вот как оболочка Linux запускает новые программы