C语言 我的代码在第一个命令后不执行?

00jrzges  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(97)

输入

echo "/bin/ls
     /bin/ls
/bin/ls
   /bin/ls     " | ./hsh

字符串
输出
仅第一个/bin/ls
我想知道为什么它不执行其他命令?我使用strtok来分割字符串输入,因为我理解echo将输入作为由\n分隔的字符串。
我试着在对每个线程进行标记化后执行,它也给出了相同的输出

#include "O_X.h"

/**
 * main - program
 * Return: 0 on success, -1 on fail
 */
char **environ;

int main(void)
{
    char *buff = NULL, *token = NULL;
    int size = 1, kiddo = 0, stat = 0;
    char *arg[] = {"" ,NULL};
    size_t len = 33;
    while (1)
    {
        size = getline(&buff, &len, stdin);
        if (size == -1)
        {
            free(buff);
            exit(0);
        }
        else if (buff == NULL)
            free(buff);
/*      else if (buff[size - 1] == '\n')
            buff[size - 1] = '\0';*/

        token = strtok(buff, "\n");
        while (token != NULL)
        {
            token = strtok(NULL, "\n");
        }

        kiddo = fork();
        if (kiddo == -1)
            printf("Process error!\n");
        if (kiddo == 0)
        {
            if (buff[0] != '/')
              buff++;
                execve(buff, arg, environ);
            return (0);
        }
        else
        {
            wait(&stat);
        }
    }
    return (0);
}

fkvaft9z

fkvaft9z1#

您的问题来自buff,它可能在您要运行的程序之前或之后包含额外的空格。
strtok可以用来删除不需要的字符:

while (1)
{
    size = getline(&buff, &len, stdin);
    if (size <1)
    {
        exit(0);
    }

    // extract first sequence of non-spaces characters for buff
    token = strtok(buff, " \t\n");

    if(*token == 0) {
        // empty line, go next line
        continue;
    }

    kiddo = fork();
    if (kiddo == -1)
        printf("Process error!\n");
    if (kiddo == 0)
    {

        printf("token(child): '%s'\n", token);
        // here you can call "arg[xx] = strtok(NULL, " \t\n");" to get the arguments
        execve(token, arg, environ);
        printf("execution of '%s' failed\n", token);
        return (1);
    }
    else
    {
        wait(&stat);
    }
}

字符串

brgchamk

brgchamk2#

我解决了问题后,托比的答案,问题是在执行过程中,因为它在主函数返回,过程停止后,第一个命令,并不看别人,我使用单独的功能执行. +马蒂厄提到incerementing buff不去第二个令牌,所以我改变了逻辑

相关问题