Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: последовательный запуск 4-х процессов  (Прочитано 12993 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Lifetowin
Интересующийся

ru
Offline Offline

« : 13-12-2013 14:58 » 

Ребята нужна ваша помощь.

Необходимо последовательно запустить 4 любых процесса используя execl , execlp , execv , execvp;
Затем вывести их индентификаторы и закрыть процессы в обратном порядке. 
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-12-2013 17:57 » 

Lifetowin,
for CMD in execl execlp execv execvp; do man $CMD & done; for N in $(seq 1 4); do fg $N; done

... и закрыть процессы в обратном порядке.

for CMD in execl execlp execv execvp; do man $CMD & done; for N in $(seq 4 -1 1); do fg $N; done
« Последнее редактирование: 13-12-2013 22:32 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Lifetowin
Интересующийся

ru
Offline Offline

« Ответ #2 : 15-12-2013 18:19 » 

Lifetowin,
for CMD in execl execlp execv execvp; do man $CMD & done; for N in $(seq 1 4); do fg $N; done

... и закрыть процессы в обратном порядке.

for CMD in execl execlp execv execvp; do man $CMD & done; for N in $(seq 4 -1 1); do fg $N; done

Спасибо! Все отлично работает , но хотелось бы все это на С/C++.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 15-12-2013 19:17 » 

В чем проблема? Форкаеш процесс. В дочернем процессе запускаеш свой exec. Головной процесс при форке получает PID дочернего процесса. 
Чтобы завершить процесс, нужно с помошью kill послать сигнал SIGTERM в дочерний процесс. Ну или совсем убийственный SIGKILL.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Lifetowin
Интересующийся

ru
Offline Offline

« Ответ #4 : 15-12-2013 20:14 » 

 Запустить один процесс я вроде "смог" и пид его "получил" , но не могу понять как запустить их несколько и при этом еще использовать разные exec().
 С закрытием я тоже не могу разобраться.
 Под линукс я не "писал" на руках только методичка с неработающим кодом и  срок до пятницы.Все же что то я все таки смог склеить.
Код: (C++)
   
     pid_t wpid = 0;
     wpid = fork();
     printf("application PID is %d\n", getpid());

    const char*path = "/usr/games/sol";
    char*const args[] = {"sol",NULL};

    execv(path,args);
 
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 15-12-2013 20:26 » 

У тебя сейчас два запушенных процесса. Причем в главном процессе ты получиш PID дочернего процесса. А в дочернем ты получиш 0. Следовательно отсюда надо и плясать.
Код: (C++)
pid_t pid = 0;
pid = fork();
if (pid == 0) {  
     const char*path = "/usr/games/sol";
     char*const args[] = {"sol",NULL};
     execv(path,args);
}
Так для затравки. Не знаю, есть ли у тебя сейчас Linux под рукой. Но в принципе ты можеш посмотреть справку по фцнкциям через man, Например
man 2 kill

ЗЫ. Fork нужно также проверять на возврат -1. Если вернулось такое значение, значит произошла ошибка.
« Последнее редактирование: 15-12-2013 20:35 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Lifetowin
Интересующийся

ru
Offline Offline

« Ответ #6 : 15-12-2013 21:32 » 

Все же не пойму как открыть несколько процессов. Точнее они вроде как открываются , но возвращают тот же пид ,
что и предыдущий.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 15-12-2013 21:49 » 

Значит ты что то делаеш не правильно. Вот небольшой пример набрасал.
Код: (C++)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
  pid_t pid[4]= {0,0,0,0};
  for (int i=0; i<4; ++i) {
    pid[i] = fork();
    if (pid[i] == -1){
      perror("fork");
    } else {
      if (pid[i] == 0) {
        sleep(10);
        exit(0);
      } else {
        printf("PID of child process is %d\n", pid[i]);
      }
    }
  }
  return 0;
}
Вывод
$ g++ fork.cpp -o fork
$ ./fork
PID of child process is 17878
PID of child process is 17879
PID of child process is 17880
PID of child process is 17881
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Lifetowin
Интересующийся

ru
Offline Offline

« Ответ #8 : 15-12-2013 23:23 » 

А, что насчет этого? Вроде меня все устраивает , но пиды  выводятся  через 3.

Код: (C++)
pid_t pid[3]= {0,0,0};
  for (int i=0; i<3; ++i) {
    pid[i] = fork();
    if (pid[i] == -1){
      perror("fork");
    } else {

      if (pid[i] == 0) {
           switch(i){
           case 0:
           {
                const char*path = "/usr/games/sol";
                char*const args[] = {"sol",NULL};
                execv(path,args);
                exit(0);
            break;
            }
            case 1:
            {
                const char*path = "/usr/games/gnome-mines";
                char*const args[] = {"gnome-mines",NULL};
                execv(path,args);
                exit(0);
            break;
            }
            case 2:{
                const char*path = "/usr/games/gnome-mahjongg";
                char*const args[] = {"gnome-mahjongg",NULL};
                execv(path,args);
                exit(0);
            break;
            }
                }


      } else {
        sleep(1);
        printf("PID of child process is %d\n", pid[i]);
      }

    }
  }
    for(int i = 2; i >= 0; i--)
    {
    sleep(1);
    kill(pid[i],SIGTERM);

    }
    return 0;
 
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 16-12-2013 09:29 » new

Идентификаторы процессов глобальны для всей ОС и не обязаны идти подряд.

Замечание: недостаточно просто убить дочерние процессы, надо выполнить wait4(). Забыв убрать за собой замусориваешь систему процессами-зомби. Современные ОС умеют их убирать автоматом, но только после завершения родительского процесса.
« Последнее редактирование: 16-12-2013 09:33 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines