繁体   English   中英

程序使用execv将一个进程的输出管道传输到另一进程

[英]Program to pipe output of one process to other process using execv

我正在尝试执行“ sudo conntrack -E -p udp -e NEW”命令,然后将此命令的输出通过管道传送到“ logger”命令,但这不起作用。 有什么明显的问题吗? 因此父级是“ sudo conntrack ....”,它派生了子级“ logger ...”

void main () {

pid_t  pid;
int    status;
int j=0;
int exe_process;
FILE *prt1;
FILE *prt2;
int fd[2];

char *arg[]={ "sudo", "/usr/sbin/conntrack", "-E", "-p", "udp", "-e", "NEW", NULL };
char *arg1[]={ "/usr/bin/logger", "-t", "log-conntrack", "-p", "daemon.notice", NULL };


if (pipe(fd) < 0)
 printf("pipe error\n");

    if ((pid = fork()) < 0)       /* fork a child process           */
    {
            printf("ERROR: forking child process failed\n");
            exit(1);
    }
    else if (pid > 0)           /* for the parent process:         */
    {
            printf("In parent process %d\n",getpid());
            close(fd[0]);

            if (execvp("/usr/sbin/conntrack", arg)  < 0)       /* execute the command  */
            {
                    printf("ERROR: exec failed\n");
                    exit(1);
            }
           prt1=fdopen(fd[1], "ab");
    }
    else                                       /* for the child:      */
    {
            printf("In parent child %d\n",getpid());
            close(fd[1]);
            prt2=fdopen(fd[0], "rb");

            if (execvp("/usr/bin/logger", arg1)  < 0)       /* execute the command  */
            {
                    printf("ERROR: exec failed\n");
                    exit(1);
            }

    }

}

几乎是正确的,但是主要的问题是您需要dup()而不是您尝试使用fdopen dup将以您想要的方式重定向stdin / stdout。

else if (pid > 0)           /* for the parent process:         */
{
    printf("In parent process %d\n",getpid());
    close(fd[0]);

    close(1);
    dup(fd[1]);

    if (execvp("/usr/sbin/conntrack", arg)  < 0)       /* execute the command  */
    {
        printf("ERROR: exec failed\n");
        exit(1);
    }

    //prt1=fdopen(fd[1], "ab");
}

而在孩子中:

    close(0);
    dup(fd[0]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM