jelasin 的学生作业:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SZ_CMDLINE 0x100
#define SZ_ARGS 0x40
typedef struct cmdline
{
char cmd[SZ_CMDLINE];
char *args[SZ_ARGS];
} cmd_t;
int r_wait(int *status)
{
int ret_val;
while ((ret_val = wait(status)) == -1 && errno == EINTR);
return ret_val;
}
int exec_handler(const cmd_t* cmd)
{
pid_t pid;
int status;
if ((pid = fork()) cmd, cmd->args) cmd, token, SZ_CMDLINE);
#if defined(DEBUG)
printf("cmd->cmd: %s\n", cmd->cmd);
#endif
int i = 0;
while (token != NULL)
{
token = strtok_r(NULL, " ", &saveptr);
if (token == NULL)
{
break;
}
cmd->args[i] = malloc(SZ_CMDLINE);
strncpy(cmd->args[i], token, SZ_CMDLINE);
#if defined(DEBUG)
printf("cmd->args[%d]: %s\n", i, cmd->args[i]);
#endif
if (++i == SZ_ARGS)
{
perror("[WARNING ==> function parse_cmdline] too many args");
break;
}
}
cmd->args[i] = NULL;
#if defined(DEBUG)
printf("cmd->cmd: %s\n", cmd->cmd);
for (int j = 0; cmd->args[j]; j++)
{
printf("cmd->args[%d]: %s\n", j, cmd->args[j]);
}
#endif
return 0;
}
int main()
{
cmd_t cmd;
char *cmdline = malloc(SZ_CMDLINE);
while (true)
{
memset(cmdline, '\0', SZ_CMDLINE);
memset(&cmd, '\0', sizeof(cmd_t));
fprintf(stderr, "minishell-> ");
fgets(cmdline, SZ_CMDLINE, stdin);
cmdline[strcspn(cmdline, "\n")] = '\0';
if (strcmp(cmdline, "exit") == 0)
{
free(cmdline);
cmdline = NULL;
for (int i = 0; cmd.args[i]; i++)
{
free(cmd.args[i]);
cmd.args[i] = NULL;
}
break;
}
parse_cmdline(cmdline, &cmd);
exec_handler(&cmd);
for (int i = 0; cmd.args[i]; i++)
{
free(cmd.args[i]);
cmd.args[i] = NULL;
}
}
return 0;
}