我有这个主程序:
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/