c中的exit(0)只能偶尔使用

时间:2014-01-25 21:59:50

标签: c shell loops exit

我正在尝试实现自己的shell,有很多东西不能用于它但是现在我正试图解决第一个错误。 当我的shell运行并且我输入exit作为第一个命令时,它工作正常,但是,当我输入exit作为第二个输入我应该写出退出额外的时间让它退出我的shell,如果我输入它作为第3个命令,我必须再输入2次,依此类推。 这是我的代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{

    int argumentsnum;
    int status;

    char *arguments[30];
    char *temp;
    int processes_count=0;

    printf("My Shell\n");
    while (1)
    {
        char input[60];

        printf("Enter command\n");
        while (fgets(input, sizeof(input), stdin) == NULL)
        {
            printf("Enter command \n");
        } /*end whileloop*/

        for (argumentsnum = 0; argumentsnum < 31; argumentsnum++)
        {
            temp = strtok(input, " \t\n");
            if (temp != NULL)
            {
                arguments[argumentsnum] = temp;
            } /*endif*/

        } /*end forloop*/
        if (strcmp(arguments[0], "exit") == 0)
        {
            printf("Exiting shell\n");
            int i;
            For(i=0;i<processes_count;i++){
            exit(0);
          }
        } /*endif*/
        pid_t id = fork();
        processes_count++;
        if (id == -1)
        {
            perror("Grab your own fork :@ \n");
            exit(1);
        } /*endif*/
        else if (id == 0)
        {
            execvp(arguments[0], arguments);
        } /*endelse*/
        else
        {

            wait(&status);
        }
    } /*end while(1)*/

} /*endmain*/

1 个答案:

答案 0 :(得分:2)

execvp(arguments[0], arguments);

如果此次调用失败,您需要执行某些操作。如果execvp因为您传递了错误命令而失败,则子进程将继续运行。这意味着 child 将处理下一个命令,而不是 parent 。父母将被卡在wait()电话中,等待孩子终止。

execvp(arguments[0], arguments);
perror("execvp");
_Exit(1);