与execvp一起使用以剪切部分粗壮啤酒。 C

问题描述 投票:-1回答:1

我正在使用一个函数,该函数回显字符串并将输出重定向到c中的sed输入。如果我回显类似“ hello:bye bye”的字符串,则需要剪切“:”之前的所有内容。因此,我为此构建了一个函数,但是sed无法识别我的正则表达式:

void sender (char * str_ ,char * pipe_ ,char **args_) {
    int fd[2];
    int pid;
    char* cmd1[] = {"echo", str_,NULL};
    char* sed[] = {"sed","'[^:]*$'",NULL};
    int status;

    pid = fork();
    if (pid == 0) {
        if(pipe(fd) < 0){
            exit(100);
        }
        pid = fork();
        if (pid == 0) {
            close(fd[0]);
            dup2(fd[1], 1);
            close(fd[1]);
            execvp(cmd1[0], cmd1);
            printf("Error in execvp1\n");
        }else{
            close(fd[1]);
            wait(&status);
            dup2(fd[0],0);
            close(fd[0]);
            dup2(1,2);
            execvp(sed[0],sed);
            printf("Error in execvp2\n");
        }
    }
    else{
        close(fd[0]);
        close(fd[1]);
        wait(&status);
        wait(&status);
    }
}

由于sed:expression -e#1,字符1:未知命令:'''],因此每行读取的输出都是错误的。

我正在使用一个函数,该函数回显字符串并将输出重定向到c中的sed输入。如果我回显类似“ hello:bye bye”的字符串,则需要剪切“:”之前的所有内容。所以我建立了一个分叉和...

c sed pipe fork exec
1个回答
0
投票
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

void pipe_exec(int pfd[], char *cmd_args[], int redirect_output)
{
    printf("%s, pid %d\n", cmd_args[0], getpid());

    if (redirect_output)
        dup2(pfd[1], 1);
    else
        dup2(pfd[0], 0);

    close(pfd[0]);
    close(pfd[1]);
    execvp(cmd_args[0], cmd_args);
    printf("Error in execvp\n");
    exit(1);
}

void sender(char *str_, char *unused1, char **unused2)
{
    int status, pid, fd[2];
    char *cmd1[] = { "echo", str_, NULL };
    char *sed[] = { "sed", "s/[^:]*://", NULL };

    if (pipe(fd) < 0)
        exit(100);

    pid = fork();
    if (pid == 0)
        pipe_exec(fd, cmd1, 1);

    pid = fork();
    if (pid == 0)
        pipe_exec(fd, sed, 0);

    close(fd[0]);
    close(fd[1]);
    wait(&status);
    wait(&status);
}

int
main(void)
{
    sender("hello: bye bye", NULL, NULL);
    return (0);
}
© www.soinside.com 2019 - 2024. All rights reserved.