C child reads "temporarily unavailable resource"

So, I have a file stream from the parent process for the child - and most of the time it works fine. However, when reading from it several times quickly, using the fgets () function returns NULL, and a "temporarily unavailable resource" is set for the error. The problem is intermittent - and running a script that will sometimes have fgets in readings returns NULL, and sometimes it won't.

Can someone help me stop this error? Thank!

Edit: here is the code. I'm not sure which other code would be useful? there is quite a bit

// 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;
}

According to the request, the code that opens the channel and processes the child process.

// 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);

} 
+3
source share
1

, - .

( , , EAGAIN/EWOULDBLOCK, read() , IO ).

, , , .

:

  • strace() , EAGAIN? ?

  • printf("%d\n", fcntl(fileno(fpin), F_GETFL)); fgets()?

+8

Source: https://habr.com/ru/post/1744078/


All Articles