_wspawnl / _spawnl эквивалент в Mac OS X или Linux

0

Я просто переношу код в Mac OS X, который использует _tspawnl в Windows.

Есть ли что-то эквивалентное _tspawnl в Mac OS X или Linux?

Или есть ли какой-либо posix, эквивалентный _tspawnl

Теги:
macos
posix

2 ответа

1
Лучший ответ

Вы можете использовать системный вызов 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).

  • 0
    Я думаю, что fork будет порождать дочерний процесс. Но я хочу запустить новый процесс, заданный аргументом. Достаточно ли execv для моей цели?
  • 0
    Да. Fork создает новый процесс, который является копией родительского процесса. Когда execv вызывается, текущий образ процесса заменяется новым образом процесса. Вот как оболочка Linux запускает новые программы
Показать ещё 1 комментарий
1

Вы можете использовать fork()/exec(), как уже указывалось, однако более близким системным вызовом является posix_spawn() (manpage).

Однако может быть немного боль в настройке, но есть пример кода, который используется здесь (обратите внимание, что этот код также предоставляет функциональность для Windows с использованием API CreateProcess(), который, вероятно, вы должны использовать под Windows в любом случае).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню