好点吗?

好点吗?
#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更强大。例如允许设置管道。
  • 还有其他高级库可以为大多数用途提供良好的抽象。
  • 使用forkandexec有利于学习,即使您最好使用高级库(或自己抽象)。

相关内容