linux下如何创建子进程并对其输入输出进行读写 在linux下怎么样才能创建一个子进程,并对子进程的stdin和stdout进行读写呢?网上查不到相关的资料。1 应用场景不是fork,是调用另外一个可执行文件。2 system函数只能创建子进程,不能对其标准输入输出进行读写。3 popen仅能获取输入流或者输出流,不能同时获取。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1. 调用另一个执行文件的本质是 fork +exec2. system 的本质是 fork + exec + wait3. popen 的本质是 fork + pipe + wait用两个 pipe 创建 两个管道 即可#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include <string.h>static voidparent(int in, int out){ ssize_t len; char buf[64]; sprintf(buf, "parent: pid=%d\n", getpid()); len = strlen(buf); write(out, buf, strlen(buf)); len = read(in, buf, sizeof(buf)); if (len > 0) { buf[len] = '\0'; printf("from child: \n[%s]\n", buf); }}static voidchild(int in, int out){ dup2(in, STDIN_FILENO); dup2(out, STDOUT_FILENO); execlp("cat", "cat", "-", (char *)0);}intmain(int argc, char *argv[]){ pid_t pid; int infds[2]; int outfds[2]; pipe(infds); pipe(outfds); printf("parent: pid=%d\n", getpid()); pid = fork(); if (pid > 0) { parent(outfds[0], infds[1]); } else { child(infds[0], outfds[1]); } return 0;} ubuntu 清理 root kmemleak工具查询内存泄露,该如何解决? 【Docker安装morunchang/fastdfs】通过Java客户端实现了上传。但是在浏览器访问不到。 salt-master端使用state.highstate批量远程执行报错 安装linux后,启动Windows 7失败。这样怎么解决? 谢谢。 一个新手 怎么卸载Ubuntu系统 远程工具乱码,求助 Ubuntu安装后无法识别,求个前辈帮帮忙 菜鸟请教 Linux登录微信遇到问题求助 liunx 求助大神: Xubuntu无法自动开启wifi功能!
2. system 的本质是 fork + exec + wait
3. popen 的本质是 fork + pipe + wait用两个 pipe 创建 两个管道 即可#include <sys/types.h>
#include <unistd.h>#include <stdio.h>
#include <string.h>static void
parent(int in, int out)
{
ssize_t len;
char buf[64]; sprintf(buf, "parent: pid=%d\n", getpid());
len = strlen(buf);
write(out, buf, strlen(buf)); len = read(in, buf, sizeof(buf));
if (len > 0) {
buf[len] = '\0';
printf("from child: \n[%s]\n", buf);
}
}static void
child(int in, int out)
{
dup2(in, STDIN_FILENO);
dup2(out, STDOUT_FILENO);
execlp("cat", "cat", "-", (char *)0);
}int
main(int argc, char *argv[])
{ pid_t pid;
int infds[2];
int outfds[2]; pipe(infds);
pipe(outfds); printf("parent: pid=%d\n", getpid()); pid = fork();
if (pid > 0) {
parent(outfds[0], infds[1]);
} else {
child(infds[0], outfds[1]);
} return 0;
}