Ошибка с форком, execvp на C?

У меня проблемы с execvp и fork. Когда я запускаю код, exec не работает, даже когда файл создан. Он просто возвращает ошибку «Неверный адрес». Кроме того, printf («в дочернем элементе») не появляется, когда я его запускаю. Как мой код может получить execvp без печати «в дочернем»?

     pid = fork();
     switch(pid) {
     case -1:
         fprintf(stderr,"ERROR WITH FORK\n");
         exit(1);
         break;

     case 0:
         printf("in the child");
         fd = open(filename,O_CREAT | O_APPEND,0777);
         if(dup2(fd,1) < 0)
         {
             fprintf(stderr,"dup error: %s",strerror(errno));
         }

         if(execvp(command,args) == -1)  //is null terminated
         {
             fprintf(stderr,"exec error %s\n",strerror(errno));
         }

         break;

     default:
        wait(NULL);
        break;

person user2900984    schedule 20.10.2013    source источник
comment
Буферизация, сброс и т. д. Добавьте новую строку.   -  person Kerrek SB    schedule 21.10.2013
comment
Я не понимаю, о чем ты говоришь. Файл создается, поэтому строка имени файла правильно отформатирована с нулевым значением. где мне понадобится новая строка, которая заставит мой код работать? о каком буфере вы говорите?   -  person user2900984    schedule 21.10.2013
comment
Буфер в printf. Заставьте его напечатать "in the child\n", чтобы увидеть вывод.   -  person Kerrek SB    schedule 21.10.2013
comment
Ясно спасибо. Я не ожидал, что новая строка повлияет на то, напечатано что-то или нет. Любая идея, почему я продолжаю получать плохой адрес? Это работает, когда я убираю материал перенаправления, но с ним в коде я получаю неверный адрес.   -  person user2900984    schedule 21.10.2013
comment
Вы проверили, что fd действителен?   -  person Kerrek SB    schedule 21.10.2013
comment
Неверный адрес означает, что ваша команда и/или аргументы недействительны.   -  person n. 1.8e9-where's-my-share m.    schedule 21.10.2013
comment
да. Я бросил сообщение в stderr, если открытие не сработало, но оно сработало, и файл был создан. Однако execvp по-прежнему возвращает неверный адрес. Но когда я комментирую элементы open и dup2, запускается execvp, а затем я заканчиваю родительский элемент.   -  person user2900984    schedule 21.10.2013


Ответы (1)


Массив указателей (второй аргумент в execvp()) должен заканчиваться указателем NULL. Добавьте 0 или NULL в конце args.

person Sinstein    schedule 23.04.2014