c - 如何通过管道在外部程序中使用 STDIN 数据

标签 c pipe fork

我有这个主程序:

char data[1024]="Hello World!";
int main(int argc,char *argv[])
{
    pid_t pid;
    int f1[2];
    pipe(f1);
    if((pid=fork())==0)
    {
        close(f1[1]);
        dup2(f1[0], STDIN_FILENO);
        if((execlp("./2","./2",NULL))==-1) printf("error");
        close(f1[0]);
    }
    else
    {
        close(f1[0]);
        dup2(f1[1],STDOUT_FILENO);
        write(f1[1], data, sizeof(data));
        close(f1[1]);
        wait(NULL);
    }
    return 0;
}

和2.c程序:

int main(int argc,char *argv[])
{
    char DATA[1024];
    //sprintf(DATA,"J'ai lu %s",argv[1]);
    //read(0,DATA,sizeof(DATA));
    int taille=strlen(DATA);
    int i;
    for(i=0;i<taille;i++)
    {
        if(DATA[i]=='c')
        {
            printf("found");
        }
    }   
}

如果我想在子程序执行的程序中使用父程序在 STDOUT 中写入的数据,我是否必须从 exec 程序中的 STDIN 读取,或者是否必须将数据作为参数传递到执行?或者也许是别的什么?

最佳答案

由于您将管道复制到 STDIN_FILENO,因此您需要从子程序中的 stdin 读取以获取父程序写入管道的内容。

此外,您还需要将 close(f1[0]); 调用移至调用 execlp() 之前。如果 exec 成功,则原始程序中后面的任何内容都不会运行。

如果您想查看子程序中的输出,您应该查找 Hello World! 中的字符:

if (DATA[i] == 'o') {
    printf("found\n");
}

关于c - 如何通过管道在外部程序中使用 STDIN 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41028807/

相关文章:

c# - C++ NamedPipeClientStream 发送数据

Conio.o 在 Dev C 中不可用 - C

shell - 管道输入到脚本中

c++ - Qt GUI 应用程序意外结束

c - Waitpid 和 fork/exec 相对于系统调用的非阻塞优势?

linux - 通过使用允许仅运行恢复进程的内核补丁来从 fork 炸弹中恢复

c - 对 `function' 的 undefined reference

c - 指针数组作为函数参数

c - 如果我不能将一个以上的字符作为字符变量,那么声明等级='A+'的方法是什么?

c - 使用exec运行/usr/sbin下的文件