Linux-popen 执行其他程序,如何既是这个程序的输入又是输出
如b.c,会编译成b,这个程序就是读取用户的输入,然后打印出来,代码如下:
#include <stdio.h>
int main(){
int input = 0;
scanf("%d", &input);
printf("input_num is %dn", input);
return 1;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
1应该是不行的.
2或者如何让popen既是输入又是输出;-- popen打开的是单向的pipe. 如果需要双向的. 自己写一个.
b.c不变
a.c如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void err_sys(char* msg)
{
perror(msg);
exit(-1);
}
int
main()
{
int fd[2]; //write by parent, read by child
int fd1[2]; //write by child, read by parent
int pid;
if(pipe(fd) < 0)
err_sys("pipe error");
if(pipe(fd1) < 0)
err_sys("pipe1 error");
if((pid = fork()) < 0)
err_sys("fork error");
else if(pid > 0){//parent
close(fd[0]); //not read fd
close(fd1[1]); //not write fd1
if(write(fd[1], "2n", 2) < 0)
err_sys("write error");
char tmp[255];
int n;
if((n = read(fd1[0], tmp, 255)) < 0)
err_sys("read error");
if(write(1, tmp, n) < 0)
err_sys("write error");
}else{ //child
close(0);
close(1);
close(fd[1]); //not write fd
close(fd1[0]); //not read fd1
dup2(fd[0], 0);
dup2(fd1[1], 1);
if(execl("./b", NULL) < 0)
err_sys("exec error");
}
if((waitpid(pid, NULL, 0) < 0))
err_sys("wait_pid error");
return 0;
}