2017-01-17 3 views
0

나는 tcsh에서 같은 기본 C 셸을 재현하기 위해 노력하고있어,하지만 난 변수 $status을 이해하는 데 문제가 있습니다. 존재하지 않는

$> pwd 
/home/user 
$> echo $status 
0 

명령 :

$> foo 
foo: Command not found. 
$> echo $status 
1 

어떤 상태의 값을 참조 할 존재

명령 :이 tcsh의 상태의 예입니다? tcsh에서 반환 값은?

+1

당신은 당신이'exit' 함수를 사용하여 C 프로그램을 종료 할 수 있음을 알고

쉘은 일반적으로이 같은 명령을 시작? 'exit'에 전달하거나'return' 문과 함께 사용하는 값은 프로세스의 종료 코드이며'$ status' tcsh 변수에 반환되고 사용되는 값입니다. tcsh는 또한 프로그램이 발견되지 않을 때 (예를 들면) 사용되는 것과 같은 특별한 상태를 가지고있다. 특별한 경우에 사용 및 설정되는 상태는 귀하에게 달려 있습니다. –

+1

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#status –

+0

그래, 난 그 알고,하지만 난 쉘 인터프리터를 재현하고있어 이후, 난 내 코드를 실행하는 무한 루프를 사용하고있을 것이다 사용자 입력을 기다립니다. 주 메뉴에서 값을 반환하거나 종료 함수를 사용하면 프로그램이 종료됩니다. – James

답변

2

$status 또는 $?은 이전의 종료 상태 명령을 시작을 의미합니다. 좀 더 정확하게 말하자면, 자식 프로세스의 종료 상태. 기존 명령이 없으면 fork 된 자식 셸이 있기 때문에 명령에 exec()이 실패합니다. 또는`main` 함수에서 반환하여

 
int pid = fork(); 
if (pid == 0) { /* Child shell process */ 
    /* Try to replace child shell with cmd, in same child PID */ 
    /* cmd will generate the exit status of child process */ 
    execve(cmd, argv, envp); 

    /* If execve returns, it's always an error */ 
    /* Child shell generates exit status for error */ 
    write(2, "command not found\n", 18); 
    exit(127); 
} else {   /* Parent shell process */ 
    /* Original shell waits for child to exit */ 
    int status; 
    wait(&status); /* Assuming only one child */ 

    /* this is accessible in shell as $status or $? */ 
    status = WEXITSTATUS(status); 
}