Решено: как запустить процесс и вернуть PID

Модератор: Модераторы разделов

VergilEx
Сообщения: 10

Решено: как запустить процесс и вернуть PID

Сообщение VergilEx »

День добрый. Надо запускать много процессов и работать с ними по PID. Но механизм который мне предлагают fork/exec ужасно неудобен. Поясню - мне надо вызвать форк и проверить его ретурн. а у меня этот вызов по середине программы следовательно если я не хочу чтоб мои действи до вызова форка не повторялись в потомке мне надо поставить условие на какойнибудь env или юзать пайп. а как еще потомок узнает что он потомок не доходя до fork(). [b]Развен нет в библиотеках функции наподобии CreateProcess в WinApi?[b]
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Решено: как запустить процесс и вернуть PID

Сообщение Portnov »

А man fork почитать?

Код: Выделить всё

#include <stdio.h>
#include <unistd.h>

int main() {
  int pid;
  printf("Hello world! (this line will be executed once, in parent process)\n");
  if (pid = fork()) {
    printf("We are in parent process now; child's PID is %d\n", pid);
  } else {
    pid = getpid();
    printf("We are in child process now; our PID is %d\n", pid);
  }
  printf("This will be executed twice: in child and in the parent processes.\n");
  return 0;
}


Вывод:

Код: Выделить всё

$ ./fork
Hello world! (this line will be executed once, in parent process)
We are in child process now; our PID is 9935
This will be executed twice: in child and in the parent processes.
We are in parent process now; child's PID is 9935
This will be executed twice: in child and in the parent processes.


Выполнение дочернего процесса продолжается с места вызова fork().
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: как запустить процесс и вернуть PID

Сообщение RasenHerz »

Читаем доки по fork() и waitpid(), а потом уже рассказываем сказки о том, что "механизм который мне предлагают fork/exec ужасно неудобен" - waitpid(PID, &status, WNOHANG) запишет в status код завершения потомка с pid = PID не блокируя родительский процесс в случае если потомок еще не завершил свою работу.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Решено: как запустить процесс и вернуть PID

Сообщение frp »

VergilEx писал(а):
09.09.2009 15:39
Развен нет в библиотеках функции наподобии CreateProcess в WinApi?

Самый простой вариант:

Код: Выделить всё

void LinCreateProcess(char* name, char** argv)
{
     if(fork()==0)execvp(name,argv);
}

Если нужен PID, то немного модифицируем:

Код: Выделить всё

pid_t LinCreateProcess(char* name, char** argv)
{
     pid_t pid=fork();
     if(pid==0)execvp(name,argv);
     else return pid;
}

А вообще, насколько я понял, не нужна вам эта функция, вам нужен ман по fork.
Спасибо сказали:
VergilEx
Сообщения: 10

Re: Решено: как запустить процесс и вернуть PID

Сообщение VergilEx »

И правда :rolleyes: Я почемуто думал потомок запускается с начала а не с места вызова форк. Всем большое спасибо за помощь
Спасибо сказали: