简体   繁体   English

为什么我的“ dup2(STDIN_FILENO,fd)”无法将参数发送给grep?

[英]Why my “dup2(STDIN_FILENO, fd)” cannot send argument to grep?

Log: 日志:

@myLaptop:~/test$ gcc -o ./exe ./main.c @myLaptop:〜/ test $ gcc -o ./exe ./main.c

@myLaptop:~/test$ ./exe @myLaptop:〜/ test $ ./exe

Before waitpid: : Success 在waitpid之前::成功

After dup2: : Success dup2之后::成功

....(my terminal wait something in this line...Only Ctrl + C can be activated) I think waitpid waits something. ....(我的终端在这一行中等待着某些东西。。。只有Ctrl + C可以被激活)。 :( :(

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <wait.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
    system("rm -rf ./stdinTest");
    system("ls -all / > ./stdinTest");

    char **argv = (char **)malloc(sizeof(char *) * 3);

    argv[0] = (char *)malloc(strlen("grep") + 1);
    strcpy(argv[0], "grep");

    argv[1] = (char *)malloc(strlen("bin") + 1);
    strcpy(argv[1], "bin");

    argv[2] = NULL;

    int fd = open("./stdinTest", O_RDONLY);
    pid_t cpid;

    if ((cpid = fork()) == 0){
        dup2(STDIN_FILENO, fd);
        perror("After dup2: ");
        execvp(argv[0], argv);
    }
    else{
        perror("Before waitpid: ");
        waitpid(cpid, NULL, 0);
        perror("After waitpid: ");
        close(fd);
    }
    return 0;
}   

The line dup2(STDIN_FILENO, fd); dup2(STDIN_FILENO, fd); should be dup2(fd, STDIN_FILENO); 应该是dup2(fd, STDIN_FILENO);

see http://man7.org/linux/man-pages/man2/dup.2.html 参见http://man7.org/linux/man-pages/man2/dup.2.html

The following code could work: 以下code可以工作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <wait.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
    system("rm -rf ./stdinTest");
    system("ls -all / > ./stdinTest");

    char **argv = (char **)malloc(sizeof(char *) * 3);

    argv[0] = (char *)malloc(strlen("grep") + 1);
    strcpy(argv[0], "grep");

    argv[1] = (char *)malloc(strlen("bin") + 1);
    strcpy(argv[1], "bin");

    argv[2] = NULL;

    int fd = open("./stdinTest", O_RDONLY);
    pid_t cpid;

    if ((cpid = fork()) == 0){
        dup2(fd, STDIN_FILENO);
        perror("After dup2: ");
        execvp(argv[0], argv);
    }
    else{
        perror("Before waitpid: ");
        waitpid(cpid, NULL, 0);
        perror("After waitpid: ");
        close(fd);
    }
    return 0;
}

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

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