将管道作为exec中的参数传递

0 c fork pipe exec

我正在尝试将管道传递给另一个使用execv创建的进程.到目前为止,这是我的代码,但它不起作用.我到处寻找信息,但我找不到任何具体的关于通过管道vie exec.任何帮助表示赞赏.谢谢

int fd[2];
pipe(fd);

char passwrite[1];
sprintf(passwrite, "%d", fd[0]);

char arg[1];
arg[1]=passwrite;

int x;
x=fork();
if (x==0) {
execv("NewProg",arg);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 6

管道是单向连接,通常最终位于由共同祖先关联的两个进程之间,通常是要创建的两个进程中的第一个,除非它是shell,在这种情况下shell创建管道并且有两个子进程使用管道.管道有一个写入端,由一个过程使用; 它具有另一个使用的读取结束.通常最简单的方法是将一个过程的标准输出连接到另一个过程的标准输入.使用文件描述符而不是标准I/O文件流也是最简单的.

操作顺序是:

  1. 打电话pipe()来创建管道.
  2. 打电话fork()来创造一个孩子.
  3. 子进程(返回值为0 fork())执行:
    • close() 管道的写端
    • dup2() 管道的读取结束到标准输入
    • close() 管道的读端
    • execve() 将从管道读取的子进程(其标准输入)
  4. 父进程(返回值> 0 fork())执行:
    • close() 管道的读端
    • dup2() 管道的写入结束到标准输出.
    • close() 管道的写端
    • execve() 将写入管道的进程(其标准输出)

请注意,在这种情况下,您最终会关闭pipe()调用返回的两个文件描述符,并关闭它们两次(一次在父级中,一次在子级中).

如果父进程应该通过文件流写入子进程,请使用fdopen()写文件描述符上的调用(不要dup2()在其上使用,或者close()它 - fclose()在返回的文件流上关闭它fdopen(),或者通过退出) .

如果你想告诉子进程它可以读取哪个文件描述符号来从管道获取输入,那么你不需要在子进程中执行dup2(); 你可以简单地格式化一个字符数组中的字符串(复数 - 你至少需要字符,并且应该允许十几个,因为它非常便宜),然后你可以安排将参数传递给execve()函数.请记住,孩子至少需要三个指针:一个用于argv [0],程序名称; 一个用于文件描述符号; 和一个用于终止空指针.这就是execve()它何时到达参数列表的结尾.如果您正在使用execv(),则适用相同的评论; 你只是无法确定孩子的环境(例如,它收到的环境变量列表); 它将获得与父进程在此时相同的环境fork().

3和4各自的第一步是关键步骤.如果省略它们,管道将无法正常工作.