Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2009, 15:01   #1
An123
 
Регистрация: 17.10.2009
Сообщений: 9
Смущение управление процессами

Необходимо реализовать функцию запуска и параллельного выполнения нескольких программ. Задаётся количество выполняемых программ и набор их имён(пути к исполняемым образам). Исходный процесс завершается сразу после их порождения.
Написать тестовую программу для проверки работоспособности разработанной функции.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
#define NPROC 2        /* количество процессов */
 
void fnc(char *);
 
int
main(void)
{
    pid_t pids[NPROC];
    int i;
 
    for(i = 0; i < NPROC; i++) {
        pids[i] = fork();
        if(pids[i] < 0) {
            perror("fork");
            return 1;
        } else if(!pids[i]) {    /* дочерний процесс */
            fnc("ls");           /* выполнение программы ls */
        }
    }
 

 
void
fnc(char *file)
{
    execl("/bin/ls", "ls", NULL);
 
    /* сюда попадем только в случае ошибки */
    abort();
}
Как здесь использовать параметр функции fnc и брать имена программ из argv ?
и что значит - написать тестовую программу для проверки работоспособности разработанной функции?
An123 вне форума Ответить с цитированием
Старый 22.11.2009, 15:16   #2
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Как здесь использовать параметр функции fnc и брать имена программ из argv ?
Здесь - никак.

1. Чтобы передать данные через командную строку:

Код:
int main(int argc, char* argv[])
{

}
2. Имена программ можно брать хотя бы так:

Код:
	pBufData = new char[strlen(argv[i])+1];

	if(!pBufData)
	{
		printf("\nNot enough memory");
		return;
	}
	strcpy_s(pBufData, strlen(argv[i])+1, argv[i]);
Быть радикальным - значит понять вещь в её корне. К.Маркс

Последний раз редактировалось nazavrik; 22.11.2009 в 15:19.
nazavrik вне форума Ответить с цитированием
Старый 28.11.2009, 15:26   #3
An123
 
Регистрация: 17.10.2009
Сообщений: 9
По умолчанию

вот это не очень понял - что здесь происходит?
Код:
pBufData = new char[strlen(argv[i])+1];

	if(!pBufData)
	{
		printf("\nNot enough memory");
		return;
	}
	strcpy_s(pBufData, strlen(argv[i])+1, argv[i]);
и что надо сделать вот здесь:
Код:
void
fnc(char *file)
{
    execl("/bin/ls", "ls", NULL);
 
    /* сюда попадем только в случае ошибки */
    abort();
}
An123 вне форума Ответить с цитированием
Старый 28.11.2009, 19:31   #4
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

В вашем случае можно поступить просто и вводить дополнительные функции, таки как fnc нет необходимости (в Вашем варианте она все равно работать как надо не будет )

Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
#define NPROC 2        /* количество процессов */

/* функция main принимает параметры запуска программы, 
   количество параметров - argc, сами параметры в argv[]
   Важное замечание - в argv[0] всегда находится имя самой программы,
   поэтому разбирать параметры следует с argv[1] */
int main(int argc, char *argv[])				
{
    pid_t pids[NPROC];
    int i;
 
    for(i = 0; i < NPROC; i++) {
        pids[i] = fork();				/* "клонируем" наш процесс в памяти*/
        if(pids[i] < 0) {                               /* если клонирование вернуло отрицательный результат - ошибка*/
            perror("fork");
            return 1;
        } else if(!pids[i]) {       			/* если это дочерний процесс */
	       if(argv[i+1])				/* проверка - имеется ли какая либо строка в этом элементе*/
                 /* выполнение программы, переданной как аргумент, т.к. никакие парметры и переменные окружения мы не используем - 
два остальных параметра функции execl равны NULL */
                execl(argv[i+1], NULL, NULL);          
          }
    }
    return 0;
}
Запуск выглядит так, например:
Код:
#myprog vi gedit
где myprog - имя вашей скомпилированной программы, а vi и gedit - собственно сами программы, которые следует запустить

Последний раз редактировалось oleg kutkov; 28.11.2009 в 19:34.
oleg kutkov вне форума Ответить с цитированием
Старый 29.11.2009, 12:46   #5
An123
 
Регистрация: 17.10.2009
Сообщений: 9
По умолчанию

oleg kutkov, спасибо. А как здесь сделать так, чтобы пользователь сам определял количество процессов?
#myprog vi gedit -это здесь для чего? - не очень понятно

Последний раз редактировалось An123; 29.11.2009 в 13:16.
An123 вне форума Ответить с цитированием
Старый 29.11.2009, 14:46   #6
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Цитата:
oleg kutkov, спасибо. А как здесь сделать так, чтобы пользователь сам определял количество процессов?
Ну хотя бы так:

Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
/* функция main принимает параметры запуска программы, 
   количество параметров - argc, сами параметры в argv[]
   Важное замечание - в argv[0] всегда находится имя самой программы,
   поэтому разбирать параметры следует с argv[1] */
int main(int argc, char *argv[])				
{
    pid_t pid = -1;
    int i;
 
    for(i = 0; i < argc; i++) {                    /*цикл от нуля до количества параметров программы*/
        pid = fork();				/* "клонируем" наш процесс в памяти*/
        if(pid < 0) {                               /* если клонирование вернуло отрицательный результат - ошибка*/
            perror("fork");
            return 1;
        } else if(!pid) {       			/* если это дочерний процесс */
	       if(argv[i+1])				/* проверка - имеется ли какая либо строка в этом элементе*/
                 /* выполнение программы, переданной как аргумент, т.к. никакие парметры и переменные окружения мы не используем - 
два остальных параметра функции execl равны NULL */
                execl(argv[i+1], NULL, NULL);          
          }
    }
    return 0;
}
Как видно - здесь мы просто перебираем все, кроме первого, аргументы командной строки нашей программы и пытаемся запустить их как программы. pid_t pid превратился из массива в обычную переменную, т.к. хранить все идентификаторы процессов, в нашем случае, нет необходимости: fork() -> проверка -> запуск программы - > fork(), просто перезаписываем старое значение идентификатора.
Цитата:

#myprog vi gedit -это здесь для чего? - не очень понятно
Ну я же написал:
Цитата:
myprog - имя вашей скомпилированной программы, а vi и gedit - собственно сами программы, которые следует запустить
Вместо vi и gedit могут быть любые программы, которые вы захотите запустить, а в данном случае их может быть любое количество, опять же пример:
Код:
#myprog vi gedit amarok firefox
Т.е. количество запускаемых программ определяется пользователем - сколько он указал программ - стольки их и запустится.
oleg kutkov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
убить процесс по его идентификатору - Работа с процессами ACE Valery Общие вопросы C/C++ 8 04.06.2009 21:51
Управление фокусом JOHNKZ1 Общие вопросы Delphi 9 17.04.2009 17:03
Управление трафиком Roman Софт 1 01.04.2009 15:26
Управление громкостью Jupiter Общие вопросы Delphi 2 29.06.2008 15:43
Управление com портм Stanislav Общие вопросы Delphi 1 15.12.2007 19:18