加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

execv *并写入stdin

发布时间:2020-12-16 03:41:40 所属栏目:百科 来源:网络整理
导读:我正在尝试运行具有特定标准输入的程序.我成功使用了一个文件的文件描述符,其中有我想要放入stdin的内容,但是我无法直接在stdin上编写: $cat input.testecho Hello$ 代码C: int main(int argc,char **argv){ int fd = 0; fd = open("input.test",O_CREAT);
我正在尝试运行具有特定标准输入的程序.我成功使用了一个文件的文件描述符,其中有我想要放入stdin的内容,但是我无法直接在stdin上编写:
$cat input.test
echo Hello
$

代码C:

int main(int argc,char **argv)
{
  int fd = 0;

  fd = open("input.test",O_CREAT);
  close(STDIN_FILENO);
  dup2(fd,STDIN_FILENO);
  char *const args[] = { "bash",NULL };
  execvp("bash",args);
}

这样可行 :

$./a.out
Hello
$

但是,如果我尝试使用管道直接在STDIN上编写,程序将不显示任何内容并继续运行:

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

  pipe(fds);
  close(STDIN_FILENO);
  dup2(fds[1],STDIN_FILENO);
  write(fds[1],"echo Hello;",11); // Résults are identics with fds[0]
  char *const args[] = { "bash",args);
}

谢谢你的帮助

亲切,
巴斯蒂安.

编辑问题解决了:

感谢您的回答,这里的代码有效:

int main(void)
{
    int fd[2];
    pid_t pid;

    if (pipe(fd) < 0)
        return EXIT_FAILURE;

    if ((pid = fork()) < 0)
        return EXIT_FAILURE;
    else if (pid != 0) { /* father */
        close(fd[1]);
        dup2(fd[0],STDIN_FILENO);
        execlp("bash","bash",(char *)0);
    } else { /* son */
        close(fd[0]);
        write(fd[1],"echo hellon",11);
    }

    return EXIT_SUCCESS;
}

解决方法

您需要将管道的读取端复制到stdin,而不是写入端. (显然,写到写方面.)
#include <unistd.h>
#include <string.h>
#include <stdio.h>
int main(int argc,char **argv)
{
  int fds[2];
  char cmd[] = "echo hellonexitn";

  pipe(fds);
  close(STDIN_FILENO);
  dup2(fds[0],cmd,strlen(cmd));
  char *const args[] = { "bash",args);
  return 0;
}

确保检查所有这些函数的返回值,但如果不这样做,您将永远无法调试代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读