Не создаётся процесс с помощью функции execv

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 1098
ОС: астралинукс

Не создаётся процесс с помощью функции execv

Сообщение жучара »

Друзья! Вот на всякий случай её прототип:

Shell

$ man exec
...
int execv(const char *pathname, char *const argv[]);
...
$
В случае удачи просто должен создаться и отработать такой helloword:

Код: Выделить всё

//hello.c
//компилить gcc -o hello hello.c

#include <stdio.h>
int main (int argc, char *argv[])
{
  printf ("Hello, word!");
  return 0;
}
helloword создаётся и запускается так:

Код: Выделить всё

//run.c
//компилить gcc -o run run.c
//запускать ./run

#include <stdio.h>
#include <unistd.h>
int main ()
{
  
  char * const argv [1] = {"foo"};
  printf("%s\n", argv [0]);
  
  execv ("hello", NULL);
 
  // execv ("hello", &argv [0]);
  // execv ("hello", argv);

  return 0;
}
В коде выше argv и есть тот самый массив указателей на char, передающийся в программу hello, для простоты состоит из одной строки "foo". И она успешно выводится в вызывающей программе

Так, если в execv передать NULL, программа hello вызовется без ошибок (см. код выше):

Shell

$ ./run
foo
Hello, word!
$
Если вот так создать процесс hello

Код: Выделить всё

execv ("hello", &argv [0]);
или вот так

Код: Выделить всё

execv ("hello", argv);
то он воообще не создаётся:

Shell

$ ./run
foo
$
Очень, очень странно. ЧЯДНТ? Спасибо, кто откликнется. Debian 12.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21295
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Не создаётся процесс с помощью функции execv

Сообщение Bizdelnick »

man exec писал(а):The char *const argv[] argument is an array of pointers to null-terminated strings that represent the argument list available to the new program. The first argument, by convention, should point to the filename associated with the file being executed. The array of pointers must be terminated by a null pointer.
Добавлено (17:00):
А что касается процесса, то он ни в каком случае не создаётся ни одной из функций семейства exec. Для того служит fork().
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: