【问题标题】:Is there any way to implement system() function有什么方法可以实现 system() 功能
【发布时间】:2020-05-13 08:34:00
【问题描述】:

我尝试重新实现 system() 库函数。但是,如果我将 ps 或 ls 命令作为参数从 main 传递,我不会得到输出。谢谢。

原码:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<error.h>
#define buf_size 512

int main(int argc, char *argv[])
{
    pid_t pid;
    char *buf[buf_size];
    int ret = 0;
    char ch;
    int i = 0;
    int j = 0;

    if (argc != 2)
        error(1, 0, "Too many of less number of arguments\n");

    for (i = 1; i < argc; i++) {
        *(buf + j) = argv[i];
        j++;
    }
    buf[j] = '\0';
    pid = fork();
    if (pid == -1) {
        error(1, 0, "error in creating the sub-process\n");
    } else if (pid == 0) {
        execv("bin/sh", buf);
    } else {
        wait(NULL);
    }
}

阅读本文中的一些 cmets 后编辑代码:

int main(int argc, char *argv[])
{
    pid_t pid;
    int ret;

    if (argc != 2)
        error(1, 0, "Too many of less number of arguments\n");
    pid = fork();
    if (pid == -1) {
        error(1, 0, "error in creating the sub-process\n");
    } else if (pid == 0) {
        ret = execv("/bin/sh", argv);
        if (ret == -1)
            error(1, 0, "error in execv() system call\n");
    } else {
        wait(NULL);
    }
}

【问题讨论】:

  • buf[j] = '\0'; 没有意义,它应该是 buf[j] = NULL; 它会起作用,但它会产生误导,因为您使用 '\0' 作为指针。
  • 你应该测试一下bin/sh是否存在(/bin/sh呢)
  • execv后面加一些perror("...");:如果失败,你会得到一个开头的解释
  • 原始海报对这篇文章所做的编辑量已经使这些 cmets 和下面的答案完全无关紧要。我将原始代码添加到帖子中,所以这一切又变得有意义了。
  • 警告argv 使用:第一个参数是什么?

标签: c linux unix


【解决方案1】:

你离解决方案不远了。

您想念的主要事情是您应该启动 /bin/sh -c ls 而不是 bin/sh ls

更正:

  • 不要写buf[j] = "\0";,而是增加for循环大小(注意i&lt;= argc
  • 启动/bin/sh(忘记前导/
  • sh-c 添加到sh 选项。 (见 man execv)

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<error.h>

int main(int argc, char *argv[])
{
    pid_t pid;
    char * buf[4];

    if (argc != 2)
        error(1, 0, "Too many of less number of arguments\n");

    buf[0] = "sh";
    buf[1] = "-c";
    buf[2] = argv[1];
    buf[3] = NULL;

    pid = fork();
    if (pid == -1) {
        error(1, 0, "error in creating the sub-process\n");
    } else if (pid == 0) {
        execv("/bin/sh", buf);
        perror("execv"); 
   } else {
        wait(NULL);
    }
}

【讨论】:

  • OP 有'\0',而不是"\0"。它们非常不同。两者都不正确,但我不相信 OP 实际上会导致错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 2017-12-07
  • 2020-06-24
  • 2017-02-26
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多