gpt4 book ai didi

与 execv 通信()'ed program via pipe doesn' t 工作

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:50 24 4
gpt4 key购买 nike

我尝试编写一个套接字来加载程序并将套接字 io 重定向到这些程序。听起来很像 inetd,但据我所知,inetd 在请求端口时加载程序。我想让它永久加载。

到目前为止还不错。编写套接字服务器并不那么棘手,但我没有让其余的工作。我基本上想打开一个 pipe(),dup2() 它到 stdin 和 stdout 以及 execv() 我的程序。

问题是,我调用的程序没有得到任何输入。我将尝试用测试程序来展示它。有人可以告诉我,怎么了?

int create_program_fork(int *ios, char const *program) { 
// create pipes to program
if (pipe(ios) != 0) {
return -1;
}

// fork to new process
int f = fork();
if (f < 0) {
// fork didn't work
close(ios[0]);
close(ios[1]);
return(-1);
}
if (f > 0) {
// master hasn't much to do here
return f;
}
// *** Child Process
// close std** file descriptors
printf ("executing program");
close(STDIN_FILENO);
close(STDOUT_FILENO);
// duplicate pipes as std**
dup2(ios[0], STDIN_FILENO);
dup2(ios[1], STDOUT_FILENO);
// close pipes
close(ios[0]);
close(ios[1]);
// call program
return execvp(program, NULL );
}

int main(int argc, char *argv[]) {
int ios[2];

// call program
int pid = create_program_fork(ios, "/bin/bash");
if (0 != pid){
exit(EXIT_FAILURE);
}

char const exit_order[] = "exit\0";
char const order[] = ">/tmp/test.txt\0";
// do something
write(ios[1], order, strlen(order));
// bash should stop then..
write(ios[1], exit_order, strlen(exit_order));
return 0;
}

最佳答案

我看到两个可能的问题来源:

1) 管道的写入部分被重定向到子进程的标准输出,因此新进程的输出被送回输入。我建议只在子端复制管道的读取部分。如果你想拦截 child 的输出,你需要另一个 channel (即一个新的管道,或者只是让 parent 和 child 共享同一个标准输出)。

2) 您发送的字符串似乎包含面向行的命令。子进程可能需要在字符串末尾换行。这是一个很常见的问题来源。我建议检查 child 阅读输入的方式。字符串末尾的“\n”可能会有所帮助(顺便说一下,没有必要在 C 字符串的末尾显式添加“\0”,因为编译器会为您完成。无论如何,strlen 不会计算“\0”)。

关于与 execv 通信()'ed program via pipe doesn' t 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13284345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com