【发布时间】: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使用:第一个参数是什么?