【问题标题】:Segmentation fault in popen implementationpopen 实现中的分段错误
【发布时间】:2015-11-05 22:00:25
【问题描述】:

我编写了这个用于实现popen() 的C 程序。我在运行代码时遇到分段错误。 我尝试使用 execl() 而不是 execv(),但得到了同样的错误。 请帮忙

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>



#include <sys/syscall.h>
FILE *popen(const char *command,const char* mode)
{
        FILE *fp;
        int pipe_fd[2];
        pid_t pid;
                        /* Assume child is writing. */
        pipe(pipe_fd);

    if ((pid = vfork()) == 0) {     /* Child of vfork... */
            if (mode[0] == 'r') {
                    dup2(pipe_fd[1],1);
            }
            else if(mode[0] == 'w')
                    dup2(pipe_fd[0],0);
            close(pipe_fd[0]);
            close(pipe_fd[1]);



            execv(command,"");
            _exit(127);
    }
    if(mode[0] == 'r'){
            close(pipe_fd[1]);
            fp = fdopen(pipe_fd[0],mode);
    }
    else if(mode[0] == 'w'){
            close(pipe_fd[0]);
            fp = fdopen(pipe_fd[1],mode);
    }
    return fp;

}

int main(){
        File*fp;
        fp = popen("ls",'r');
}

【问题讨论】:

  • popen 是一个预定义的系统调用。 Open Standards 这是第一件事。其次,错误是什么?您是否通过调试器单步执行?
  • 我想通了...分段错误是由于 popen 的第二个参数,因为我正在传递一个字符并尝试使用指针访问其值(模式 [0])

标签: c unix segmentation-fault popen


【解决方案1】:

编译器应该警告你这个代码execv(command,"");, execv 不接受指向 char 的指针作为第二个参数,只需阅读 man execv

【讨论】:

    猜你喜欢
    • 2019-08-24
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多