C дочернее чтение, дающее “ресурс, временно недоступный”

Таким образом, у меня есть поток файла от родительского процесса до ребенка - и большую часть времени он хорошо работает. Однако, когда чтение из него многократно быстро, использование fgets () возвратят ПУСТОЙ УКАЗАТЕЛЬ, и ошибка установлена "снабдить временно недоступный". Проблема неустойчива - и запущение скрипта, который делает чтения, будет иногда иметь ПУСТОЙ УКАЗАТЕЛЬ возврата fgets и иногда привычку.

Кто-либо мог помочь мне мешать этой ошибке произойти?Спасибо!

Править: вот некоторый код.. Я не уверен, что другой код был бы полезен? существует вполне немного

// this is the bit that gets a line from the child
if( fgets( line, MAX_LINE_LENGTH, fpin ) == NULL ) {
    if( ferror(fpin) ) {
        perror("error on stream fpin");
    }
    free( line );
    return FAIL;
}

Согласно просьбе, код, который открывает канал и соглашения с дочерним процессом..

// set up pipes
int readPipe[2]; // child -> parent communication
int writePipe[2]; // parent -> child communication
int errorPipe[2]; // child -> parent, to check for errors in exec

/* create pipe */
pipe( readPipe ); // error if return val < 1 for any
pipe( writePipe );
pipe( errorPipe );
pid_t pid; /* process id when we fork */
pid = fork(); /* create new child */

if( pid == 0 ) { /* pid == 0 indicates child process */

    // close unused fds
    close( PARENT_READ );
    close( PARENT_WRITE );
    close( errorPipe[0] );

    dup2( CHILD_READ, 0 ); // replace stdin with pipe in
    dup2( CHILD_WRITE, 1 ); // replace stdout with pipe out

    /* replace child process with program to run */
    execvp(args[0], args);

    // if we get here, exec failed so inform the parent
    char *error_message = "exec failed";
    write( errorPipe[1], error_message, strlen(error_message)+1 );
    exit(-1);

} 
6
задан Gary 5 May 2010 в 06:09
поделиться

1 ответ

Это означает, что кто-то установил стандартный дескриптор входного файла как неблокирующий.

( Ресурс временно недоступен - это сообщение об ошибке, соответствующее EAGAIN / EWOULDBLOCK , которое возвращается функцией read () , только если был выбран неблокирующий ввод-вывод, и нет данных для чтения).

Обратите внимание, что возможно, что родительский процесс установит неблокирующий дескриптор файла перед выполнением вашего дочернего процесса.

Некоторые идеи для дальнейшего исследования:

  • Если вы strace () дочерний процесс, какой системный вызов возвращает EAGAIN ? По какому номеру дескриптора файла?

  • Что выводит printf ("% d \ n", fcntl (fileno (fpin), F_GETFL)); прямо перед сбойным fgets () ?

10
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: