Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

вызов внешней программы из своей с параметрами

125 views
Skip to first unread message

daniil kosenko

unread,
Oct 4, 2007, 2:45:02 PM10/4/07
to
Hi All,

Пишу консольную прогу на чистом Cи.
Нужно сделать вызов внешней программы proga.exe из своей с ключом -s и с
параметром этой программы.
То есть функцией system(). Примерно так:
system("proga.exe -sПАРАМЕТР file.txt "). ПАРАМЕТР записыватся с ключом -s
слитно.
Мне надо этот ПАРАМЕТР менять в цикле (счетчиком). Например счетчик у нас будет
i , а цикл вертится 10 раз. Получается:
system("proga.exe -si file.txt ")

Проблемы:
1) Счетчик сливается с ключом

2) Внутри функции system() счетчик не виден, даже если он ни с чем не
сливается.
Проверил путем вызова system("echo i")
Выводится "echo i" 10 раз вместо вывода
echo 0
echo 1
echo 2
....
echo 10

Как передать значение счетчика в вызов функции?

Bye.
Даниил.

Stanislav Shwartsman

unread,
Oct 4, 2007, 2:35:27 PM10/4/07
to
Hello daniil!

04 Oct 07 23:45, you wrote to All:

dk> Пишу консольную прогу на чистом Cи.
dk> Нужно сделать вызов внешней программы proga.exe из своей с ключом -s и
dk> с параметром этой программы. То есть функцией system(). Примерно так:
dk> system("proga.exe -sПАРАМЕТР file.txt "). ПАРАМЕТР записыватся с
dk> ключом -s слитно. Мне надо этот ПАРАМЕТР менять в цикле (счетчиком).
dk> Например счетчик у нас будет i , а цикл вертится 10 раз.
dk> Получается: system("proga.exe -si file.txt ")

dk> Проблемы:
dk> 1) Счетчик сливается с ключом

dk> 2) Внутри функции system() счетчик не виден, даже если он ни с чем не
dk> сливается. Проверил путем вызова system("echo i") Выводится "echo i"
dk> 10 раз вместо вывода echo 0 echo 1 echo 2
dk> ....
dk> echo 10

dk> Как передать значение счетчика в вызов функции?

char command[100];
int i;
for (i=0;i;<10;i++) {
sprintf(cmd, "echo %d\n", i);
system(cmd);
}

Voice Phones: 972-4-8330554 (home), 972-5-4481073 (cell)

Bye ! [Team Intel Centrino Technology]
Stanislav (AKA Night's Man) [Team Technion]

daniil kosenko

unread,
Oct 5, 2007, 12:29:10 AM10/5/07
to
//Hi Stanislav, //

DK>> Как передать значение счетчика в вызов функции?

SS> char command[100];
SS> int i;
SS> for (i=0;i;<10;i++) {
SS> sprintf(cmd, "echo %d\n", i);
SS> system(cmd);
SS> }

Спасибо! Все получилось!
Я совсем про sprintf() забыл... :)

Bye .
Даниил.

Andy Shevchenko

unread,
Oct 5, 2007, 12:23:44 AM10/5/07
to
Hi Stanislav Shwartsman!

On Thu, 04 Oct 07 22:35:27 +0300; Stanislav Shwartsman
<Stanislav_...@f520.n400.z2.fidonet.org> wrote about 'вызов внешней
программы из своей с параметрами':

SS> sprintf(cmd, "echo %d\n", i);
SS> system(cmd);
Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().

P.S. Автору изначального поста - лучше пока на Си вообще не писать.

--
With best regards,
Andy Shevchenko. mailto: an...@smile.org.ua


daniil kosenko

unread,
Oct 5, 2007, 1:29:55 PM10/5/07
to
//Hi Andy, //

SS>> sprintf(cmd, "echo %d\n", i);
SS>> system(cmd);

AS> Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().

Ну-ка, расскажи, и как ты этими дырами воспользуешься, крутой мега-кракер? :)

AS> P.S. Автору изначального поста - лучше пока на Си вообще не писать.

Да ну? Почему?

Bye .
Даниил.


Stanislav Shwartsman

unread,
Oct 5, 2007, 9:05:32 AM10/5/07
to
Hello Andy!

05 Oct 07 09:23, you wrote to me:

SS>> sprintf(cmd, "echo %d\n", i);
SS>> system(cmd);

AS> Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().

AS> P.S. Автору изначального поста - лучше пока на Си вообще не писать.

А на чем ему писать ?
Думаю он не коммерческую прогу пишет, чтобы кого-то эти дыры в
безопасности волновали :)
Меня точно не волнуют :)

Alexander Grebenkov

unread,
Oct 5, 2007, 2:40:52 PM10/5/07
to
Ура.

SS>> sprintf(cmd, "echo %d\n", i);
SS>> system(cmd);

AS> Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().

Дырами они являются только в том случае, если их аргумент каким-то образом
зависит от действий пользователя.

С приветом, Шурик Гребеньков. e-mail: grebenkov [не собака] gmail dot com


Andy Shevchenko

unread,
Oct 6, 2007, 10:19:55 AM10/6/07
to
Hi Stanislav Shwartsman!

On Fri, 05 Oct 07 17:05:32 +0300; Stanislav Shwartsman


<Stanislav_...@f520.n400.z2.fidonet.org> wrote about 'вызов внешней
программы из своей с параметрами':

SS>>> sprintf(cmd, "echo %d\n", i);


SS>>> system(cmd);
AS>> Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().
AS>> P.S. Автору изначального поста - лучше пока на Си вообще не писать.

SS> А на чем ему писать ?
Hа простых и понятных языках. Типа python.
SS> Думаю он не коммерческую прогу пишет, чтобы кого-то эти дыры в
SS> безопасности волновали :)
Вот так и имеем в конечном продукте дыры.
Есть класс функций, которые самое натуральное табу:
str* (без n или l),
sprintf,
system
и т.д.
Лучше от их использования сразу отказаться, чем потом искать из-за чего же
нашу супер-пупер программу ломанули или она просто упала.

P.S. Си - язык профи, а не новичков.
В Си очень легко напортачить в отличие даже от Си++.

john gladkih

unread,
Oct 7, 2007, 5:21:58 AM10/7/07
to
>>>>> "AS" == Andy Shevchenko <Andy.Sh...@f192.n465.z2.fidonet.org> writes:

AS> Есть класс функций, которые самое натуральное табу:
AS> str* (без n или l),
AS> sprintf,

просто вы не умеете их готовить! ;)

--
john, http://john.kak-sam.to

Andy Shevchenko

unread,
Oct 7, 2007, 12:14:01 PM10/7/07
to
Hi john gladkih!

On Sun, 07 Oct 07 12:21:58 +0300; john gladkih <jo...@gladkih.com> wrote about
'Re: вызов внешней программы из своей с параметрами':

AS>> Есть класс функций, которые самое натуральное табу:
AS>> str* (без n или l),
AS>> sprintf,

jg> просто вы не умеете их готовить! ;)
Да умеем, но чаще бабло побеждает зло.

john gladkih

unread,
Oct 8, 2007, 3:37:14 AM10/8/07
to
>>>>> "AS" == Andy Shevchenko <Andy.Sh...@f192.n465.z2.fidonet.org> writes:

AS> Есть класс функций, которые самое натуральное табу:
AS> str* (без n или l),
AS> sprintf,
jg> просто вы не умеете их готовить! ;)

AS> Да умеем, но чаще бабло побеждает зло.

если бы умели, то никогда бы в приличном обществе не упопинали
'n' варианты, это еще большее зло

--
john, http://john.kak-sam.to

Andy Shevchenko

unread,
Oct 9, 2007, 8:47:41 AM10/9/07
to
Hi john gladkih!

On Mon, 08 Oct 07 10:37:14 +0300; john gladkih <jo...@gladkih.com> wrote about


'Re: вызов внешней программы из своей с параметрами':

AS>> Есть класс функций, которые самое натуральное табу:


AS>> str* (без n или l),
AS>> sprintf,
jg>> просто вы не умеете их готовить! ;)
AS>> Да умеем, но чаще бабло побеждает зло.

jg> если бы умели, то никогда бы в приличном обществе не упопинали
jg> 'n' варианты, это еще большее зло
Согласен, что n-вариант без дополнительных телодвижений даёт некую
"видимость безопасности" в ущерб функциональности (или я ошибаюсь?).

john gladkih

unread,
Oct 9, 2007, 2:52:13 PM10/9/07
to
>>>>> "AS" == Andy Shevchenko <Andy.Sh...@f192.n465.z2.fidonet.org> writes:

AS> Есть класс функций, которые самое натуральное табу:
AS> str* (без n или l),
AS> sprintf,
jg> просто вы не умеете их готовить! ;)
AS> Да умеем, но чаще бабло побеждает зло.
jg> если бы умели, то никогда бы в приличном обществе не упопинали
jg> 'n' варианты, это еще большее зло

AS> Согласен, что n-вариант без дополнительных телодвижений даёт некую
AS> "видимость безопасности" в ущерб функциональности (или я ошибаюсь?).

результат работы той же strncpy абсолютно неизвестен, она ж даже
0 не пишет при превышении длинны. то есть нет даже видимой "безопасности"

--
john, http://john.kak-sam.to

Andy Shevchenko

unread,
Oct 9, 2007, 11:24:16 PM10/9/07
to
Hi john gladkih!

On Tue, 09 Oct 07 21:52:13 +0300; john gladkih <jo...@gladkih.com> wrote about


'Re: вызов внешней программы из своей с параметрами':

AS>> Есть класс функций, которые самое натуральное табу:


AS>> str* (без n или l),
AS>> sprintf,
jg>> просто вы не умеете их готовить! ;)
AS>> Да умеем, но чаще бабло побеждает зло.
jg>> если бы умели, то никогда бы в приличном обществе не упопинали
jg>> 'n' варианты, это еще большее зло
AS>> Согласен, что n-вариант без дополнительных телодвижений даёт некую
AS>> "видимость безопасности" в ущерб функциональности (или я ошибаюсь?).

jg> результат работы той же strncpy абсолютно неизвестен, она ж даже
jg> 0 не пишет при превышении длинны. то есть нет даже видимой "безопасности"
Легче пользовать strncat.

char *x;
...
x = (char *) malloc(sizeof(char) * len + 1);
if (NULL == x) return -1;
x[0] = 0;
strncat(x, y, len);
...

В случае strncpy меняется порядок:
...
strncpy(x, y, len);
x[len] = 0;
...

Понятно, что в реальной жизни надо бы ещё проверить всё ли из y уместилось в
x. В зависимости от критичности кода что-то делать.

john gladkih

unread,
Oct 10, 2007, 3:06:51 PM10/10/07
to
>>>>> "AS" == Andy Shevchenko <Andy.Sh...@f192.n465.z2.fidonet.org> writes:

AS> Есть класс функций, которые самое натуральное табу:
AS> str* (без n или l),
AS> sprintf,
jg> просто вы не умеете их готовить! ;)
AS> Да умеем, но чаще бабло побеждает зло.
jg> если бы умели, то никогда бы в приличном обществе не упопинали
jg> 'n' варианты, это еще большее зло
AS> Согласен, что n-вариант без дополнительных телодвижений даёт некую
AS> "видимость безопасности" в ущерб функциональности (или я ошибаюсь?).

jg> результат работы той же strncpy абсолютно неизвестен, она ж даже
jg> 0 не пишет при превышении длинны. то есть нет даже видимой "безопасности"

AS> Легче пользовать strncat.

AS> char *x;
AS> ...
AS> x = (char *) malloc(sizeof(char) * len + 1);
AS> if (NULL == x) return -1;
AS> x[0] = 0;
AS> strncat(x, y, len);
AS> ...

AS> В случае strncpy меняется порядок:
AS> ...
AS> strncpy(x, y, len);
AS> x[len] = 0;
AS> ...

бр... если известен len и делаешь malloc(), то 'n' варианты
вообще не нужны.

--
john, http://john.kak-sam.to

0 new messages