Решено: как запустить процесс и вернуть PID
Модератор: Модераторы разделов
-
VergilEx
- Сообщения: 10
Решено: как запустить процесс и вернуть PID
День добрый. Надо запускать много процессов и работать с ними по PID. Но механизм который мне предлагают fork/exec ужасно неудобен. Поясню - мне надо вызвать форк и проверить его ретурн. а у меня этот вызов по середине программы следовательно если я не хочу чтоб мои действи до вызова форка не повторялись в потомке мне надо поставить условие на какойнибудь env или юзать пайп. а как еще потомок узнает что он потомок не доходя до fork(). [b]Развен нет в библиотеках функции наподобии CreateProcess в WinApi?[b]
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Решено: как запустить процесс и вернуть PID
А man fork почитать?
Вывод:
Выполнение дочернего процесса продолжается с места вызова 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
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Решено: как запустить процесс и вернуть PID
Читаем доки по fork() и waitpid(), а потом уже рассказываем сказки о том, что "механизм который мне предлагают fork/exec ужасно неудобен" - waitpid(PID, &status, WNOHANG) запишет в status код завершения потомка с pid = PID не блокируя родительский процесс в случае если потомок еще не завершил свою работу.
-
frp
- Сообщения: 1445
- ОС: Debian Squeeze
Re: Решено: как запустить процесс и вернуть PID
Самый простой вариант:
Код: Выделить всё
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
И правда
Я почемуто думал потомок запускается с начала а не с места вызова форк. Всем большое спасибо за помощь