exec segfault тривиальной программы на C

Запуск тривиальной программы в gdb, которая разветвляется и запускает клиента. Строка execl (находясь внутри подчиненной 2 в gdb) дает идентификатор процесса «выполняет новую программу», а затем сразу же seg faults.

Код к этому моменту следующий:

int main(int argc, char *argv[] ) {
/* Create socket pair for communication with server, and fork/exec the server code */
  int ret;
  int fd[2];
  ret = socketpair( AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, fd );
  if( ret < 0 ) {
    perror( "Unable to create initial socketpair for qrServer" );
    return -1;
  }
  pid_t pid = fork();
  if (pid == 0) {
    char arg[4];
    bzero( arg, 4 );
    close(fd[1]);
    sprintf( arg, "%d", fd[0] );
    char* filename = "child";
    ret = execl( filename, filename, arg, NULL );

Просто для полноты дочерняя программа начинается следующим образом:

int main(int argc, char *argv[] ) {
/* Create socket pair for communication with server, and fork/exec the server code */
  if( argc < 2 ) {
    perror("Usage: argv[0] <file descriptor>");

Любые идеи? Я ничего не получаю, только саму ошибку сегмента, и я получаю ее немедленно.


person Aenid37    schedule 03.05.2016    source источник
comment
Что такое исходная строка, которая получает ошибку seg?   -  person Mark Plotnick    schedule 03.05.2016
comment
arg[4] недостаточно большой. Также заведите привычку использовать snprintf( arg, sizeof(arg), "%d", fd[0] ), чтобы избежать подобных ошибок.   -  person Steve Summit    schedule 03.05.2016
comment
@SteveSummit ... недостаточно велик. вероятно, это не так, поскольку ожидаемые значения для двух FD будут 3 и 4.   -  person alk    schedule 03.05.2016
comment
@alk Очевидно, сегодня утром я ослеп, лучше иди поешь что-нибудь и перестань комментировать.   -  person Steve Summit    schedule 03.05.2016
comment
@SteveSummit: Ура, только что выпил вечернее пиво... ;-)   -  person alk    schedule 03.05.2016
comment
Возможно, execl дает сбой, потому что дочерний элемент находится в текущем каталоге, который не является путем поиска, но трудно сказать, приведет ли это к ошибке seg, не видя больше кода.   -  person Mark Plotnick    schedule 03.05.2016


Ответы (1)


От 1_:

Список аргументов должен заканчиваться нулевым указателем, и, поскольку это функции с переменным числом переменных, этот указатель должен быть приведен к типу (char *) NULL.

Итак, эта линия

  ret = execl( filename, filename, arg, NULL );

должно быть

  ret = execl( filename, filename, arg, (char*) NULL );
person alk    schedule 03.05.2016
comment
@ Aenid37 Если это поможет, сообщите нам об этом. Если это поможет, предполагается, что (а) вы работаете на 64-битной платформе, но (б) NULL определяется как обычный 0. (Что совершенно законно, но оставляет вас уязвимыми для этой проблемы.) - person Steve Summit; 03.05.2016