C - dup2 stdin 使 dup2 stdout 和 stderr 停止打印

标签 c

我遇到了一个奇怪的问题。我目前正在创建两个程序,一个将在后台执行,另一个将读取其输出并允许对另一个在后台运行的程序进行输入。

问题是,当我放入 dup2(in, STDIN_FILENO) 行时,在后台执行的程序停止打印到文件。

读者:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
int main()
{

    int out, err, in;
    size_t i = 0, j = 0;
    int offErr = 0, offOut = 0;
    char bufErr[1024];
    char bufOut[1024];
    char *cFifo = "/tmp/out";
    char *cFifoErr = "/tmp/err";
    char *cFifoIn = "/tmp/in";

    out = open(cFifo, O_RDONLY|O_CREAT, 0600);

    err = open(cFifoErr, O_RDONLY|O_CREAT, 0600);

    in = open(cFifoIn, O_WRONLY|O_CREAT, 0600);


    while(1)
    {
        memset(bufOut, 0, 1024);
        memset(bufErr, 0, 1024);
        i=0;
        j=0;
        while(!i && !j)
        {
            j = pread(err, bufErr, 1024, offErr);
            i = pread(out, bufOut, 1024, offOut);
            offOut +=i;
            offErr +=j;
        }
        if(i)
            write(STDOUT_FILENO, bufOut, 1024);
        if(j)
            write(STDOUT_FILENO, bufErr, 1024);

    }
    return 0;
}

和作者(背景):

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
int main()
{
    int out, in, err;

    char *cFifo = "/tmp/out";
    char *cInFifo = "/tmp/in";
    char *cErrFifo = "/tmp/err";

    out = open(cFifo, O_RDWR|O_CREAT|O_TRUNC, 0600);
    in = open("/tmp/in", O_RDWR|O_CREAT|O_TRUNC, 0600);
    err = open(cErrFifo, O_RDWR|O_CREAT|O_TRUNC, 0600);

    dup2(out, STDOUT_FILENO);
    dup2(err, STDERR_FILENO);
    //dup2(in, STDIN_FILENO); //if  I uncomment this it stops printing to out or err

    system("python");

    while(1);
    return 0;
}

最佳答案

取消注释时:

//dup2(in, STDIN_FILENO); //if  I uncomment this it stops printing to out or err

您正在让 Python 从一个空文件中读取(它是在您打开它时创建和/或截断的),因此 Python 无事可做并退出。

您的阅读器代码然后位于 while (1) ; 循环中,没有任何用处。

至少,在 system() 语句之后添加一个 printf(),以便您知道 Python 命令何时完成。

关于C - dup2 stdin 使 dup2 stdout 和 stderr 停止打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41686807/

相关文章:

c - 使用 `_r` 时是否需要显式使用 `-D_REENTRANT` 后缀?

代码正在跳过程序中的命令。 (C)

c - c代码中fseek行的段错误

c - 像 kbhit 这样的标准函数是什么?

c - 二维数组struct — malloc()和free()

c - 在 C 语言中使用 getopt() 的 if 语句中的 True 和 False

c - XS 模块和 perl 构建之间的结构定义冲突

C 错误(初级)

c - 如何在c中连接一个int

无法在腻子中正确显示十六进制值