Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> возможно, опять баг 
:(
    Опции темы
MAKCim
Дата 10.3.2008, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 4
Всего: 207



проделайте следующие шаги
1.
Код

#!/usr/bin/python

# main.py

import sys

print sys.argv

2.
Код

#include <unistd.h>

/* main.c */

int main() {
    char * argv[2] = {"string", NULL};
    execve("main.py", argv, NULL);
    return 0;
}

3. компилируем main.c и запускаем
выводится 
Цитата

['main.py']

а не
Цитата

['main.py', 'string']

ошибка (если это ошибка) в fs/binfmt_script.c
в функции load_script() зачем то идет вызов функции remove_arg_zero(), которая удаляет первый параметр командной строки
вызов настолько очевиден, что на баг это не похоже
но с другой стороны, почему такое поведение
вообщем, что думаете?

Это сообщение отредактировал(а) MAKCim - 10.3.2008, 23:24


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
nickless
Дата 11.3.2008, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 7
Всего: 181



man exec пишет
Цитата(exec(3))

The functions described in this manual page are front-ends for the function execve(2).

...

The  const  char  *arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn. Together they describe a list of one or more pointers to null-terminated strings that represent the argument list available to the  executed program.  The first argument, by convention, should point to the filename associated with the file being executed.


Пример в man 2 execve
Код

/* execve.c */

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

int
main(int argc, char *argv[])
{
    char *newargv[] = { NULL, "hello", "world", NULL };
    char *newenviron[] = { NULL };

    assert(argc == 2);  /* argv[1] identifies
                           program to exec */
    newargv[0] = argv[1];

    execve(argv[1], newargv, newenviron);
    perror("execve");   /* execve() only returns on error */
    exit(EXIT_FAILURE);
}

тоже передаёт название файла первым аргументом.

Возможно для скриптов первый аргумент просто заменяется названием файла скрипта, хотя в мане
Цитата(execve(2))
Interpreter scripts
An interpreter script is a text file that has execute permission enabled and whose first line is of the form:

#! interpreter [optional-arg]

The interpreter must be a valid pathname for an executable which is not itself a script.  If the filename argument of execve() specifies an interpreter script, then interpreter will be invoked with the following arguments:

interpreter [optional-arg] filename arg...

where arg...  is the series of words pointed to by the argv argument of execve().

про это не говорится...

Добавлено через 5 минут и 45 секунд
Я думаю так как первым параметром обычно передаётся название файла, а интерпреторы при таком использовании
Цитата(nickless @  10.3.2008,  22:16 Найти цитируемый пост)
interpreter [optional-arg] filename arg...

по той же конвенции тоже передают первым аргументом название скрипта, то первый аргумент просто удаляют, чтобы его не было 2 раза в списке аргументов.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
MAKCim
Дата 11.3.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 4
Всего: 207



nickless
то, что в man 2 execve об этом не говорится ни слова, меня и смутило
но в любом случае, я не понимаю, в чем тайный смысл передачи в качестве первого параметра командной строки фиктивного параметра
достаточно в fs/exec.c в do_execve() вместо
Код

retval = copy_strings_kernel(1, &bprm->filename, bprm);
         if (retval < 0)
                 goto out;
 
         bprm->exec = bprm->p;
         retval = copy_strings(bprm->envc, envp, bprm);
         if (retval < 0)
                 goto out;
 
         retval = copy_strings(bprm->argc, argv, bprm);
         if (retval < 0)
                 goto out;

написать
Код

         retval = copy_strings(bprm->envc, envp, bprm);
         if (retval < 0)
                 goto out;
 
         retval = copy_strings(bprm->argc, argv, bprm);
         if (retval < 0)
                 goto out;
    retval = copy_strings_kernel(1, &bprm->filename, bprm);
         if (retval < 0)
                 goto out;



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Клуб юнуксоидов"
powerfox
ZeeLax
nickless

Что такое клуб юнуксоидов?

Это место более свободного общения специалистов и любителей *NIX систем.


Новичкам: Этот раздел предназначен в основном именно для общения а не решения проблем.


Правила всего раздела Linux/UNIX сюда не распространяются, но здесь имеются свои правила:


  • Оскорбления запрещены.
  • Holy wars разрешены, но в небольших размерах. Если вы создаёте что-то уровня Windows vs. Linux, то постите это в Религиозных войнах, пожалуйста.
  • Если вы хотите выставить здесь какое-либо своё творение - милости просим.
  • За интересные новости, интересные статьи, высказывания и юмор (в тему) + в репу.

Короче, по репе получите по полной программе ;-) Happy hacking!



Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Клуб юнуксоидов | Следующая тема »


 




[ Время генерации скрипта: 0.0993 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.