C child 读给 "resource temporarily unavailable"

标签 c process fgets

所以我有一个从父进程到子进程的文件流 - 大多数时候它工作正常。但是,当快速多次读取时,使用 fgets() 将返回 NULL,错误设置为“资源暂时不可用”。问题是间歇性的 - 运行执行读取的脚本有时会使 fgets 返回 NULL,有时不会。

谁能帮我阻止这个错误的发生?谢谢!

编辑:这是一些代码..我不确定还有哪些其他代码会有帮助?有很多

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

} 

最佳答案

这意味着有人将标准输入文件描述符设置为非阻塞。

(Resource temporary unavailableEAGAIN/EWOULDBLOCK 对应的错误信息,read()只有在选择了非阻塞IO且没有数据可传时才会返回阅读)。

请注意,父进程有可能在执行您的子进程之前将文件描述符设置为非阻塞。

进一步调查的一些想法:

  • 如果你strace()系统调用返回的子进程 EAGAIN ?在哪个文件描述符上?

  • printf("%d\n", fcntl(fileno(fpin), F_GETFL)); 的输出是什么?就在失败之前 fgets() ?

关于C child 读给 "resource temporarily unavailable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770235/

相关文章:

c - 获取用户输入后使用 fork 函数

c++ - 我应该如何考虑 fread() 的参数?

动态创建二维数组并复制txt文件。分割错误

windows - 在 Windows 上优雅地终止进程

process - 系统调用和上下文切换

c - 使用 feof() 从文件读取并退出循环

c - scanf 之后 fgets 不起作用

c - 术语 'Segmentation fault (core dumped)' 是什么意思?

c - 从c中的字符串数组中删除字符串

.net - 如何在.NET中创建可继承的信号量?