#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<error.h>
#define size 30
char *get_command(int argc, char *argv[]);
int my_system(const char *command);
int my_system(const char *command)
{
int ret = 0;
ret = execl("/bin/sh", "sh", "-c", command, (char *)NULL);
if (ret == -1)
error(1, 0, "error occcured in the execl() system call\n");
return 0;
}
char *get_command(int argc, char **argv)
{
int i = 0;
static char command[size];
strcpy(command, argv[1]);
for (i = 2; i < argc; i++) {
strcat(command, " ");
strcat(command, argv[i]);
}
return command;
}
int main(int argc, char *argv[])
{
pid_t pid;
pid_t ret;
int ret_system;
int i = 0;
int wstatus;
char *command;
if (argc < 2)
error(1, 0, "Too few arguments\n");
printf("The pid of the parent-process is :%d\n", getpid());
pid = fork();
if (pid == -1) {
error(1, 0, "error in creating the sub-process\n");
} else if (pid == 0) {
printf("The pid of the child- process is :%d\n", getpid());
command = get_command(argc, argv);
ret_system = my_system(command);
} else {
ret = waitpid(-1, &wstatus, 0);
printf("The pid of the child that has terminated is %d and the status of exit is %d\n", ret, wstatus);
}
return 0;
}
我正在努力将 fork() 移动到 my_system 函数,并且不使用 exec shell 而不是 exec 命令,但我无法做到这一点,我发现这很困难。能否请你帮忙。我是初学者。多谢。
int my_system(const char *command)
{
pid_t pid;
int wstatus = 0;
int ret = 0;
if (command == NULL)
return 1;
pid = fork();
if (pid == -1)
return -1;
else if (pid == 0) {
execle("/bin/sh", "sh", "-c",command, (char *)NULL);
} else {
ret = waitpid(-1, &wstatus, 0);
}
return wstatus;
}
char *get_command(int argc, char **argv)
{
int i = 0;
static char command[size];
if (argc == 1)
return NULL;
strcpy(command, argv[1]);
for (i = 2; i < argc; i++) {
strcat(command, " ");
strcat(command, argv[i]);
}
return command;
}
int main(int argc, char *argv[])
{
int ret;
char *command;
command = get_command(argc, argv);
ret = my_system(command);
if (ret == 1)
printf("Command is NULL, shell is available\n");
else if (ret == -1)
printf("Child process could not be created\n");
else
printf("The status is :%d\n", ret);
return 0;
}
答案1
要进行系统调用,就像内置系统调用一样,您应该进入fork
其中。
get_command
有一个错误。它返回一个指向堆栈变量的指针。它的行为是未定义的(它可能会工作一段时间,然后停止)。
无需检查返回值exec
:如果返回则有错误。因此变量 ret_system 只会收到 0。
另外,您不需要我们的外壳(除非您要使用它:通配符,变量扩展。您没有这样做)。
好点吗?
system
是可移植的(到 MS-Windows 和其他次要操作系统)。fork
并且exec
更强大。例如允许设置管道。- 还有其他高级库可以为大多数用途提供良好的抽象。
- 使用
fork
andexec
有利于学习,即使您最好使用高级库(或自己抽象)。