Попытайтесь использовать
this.Master.FindControl("ContentId").FindControl("controlId")
вместо этого.
8 бит кода возврата и 8 бит номера сигнала уничтожения смешиваются в одно значение при возврате из wait (2)
& co. .
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
int main() {
int status;
pid_t child = fork();
if (child <= 0)
exit(42);
waitpid(child, &status, 0);
if (WIFEXITED(status))
printf("first child exited with %u\n", WEXITSTATUS(status));
/* prints: "first child exited with 42" */
child = fork();
if (child <= 0)
kill(getpid(), SIGSEGV);
waitpid(child, &status, 0);
if (WIFSIGNALED(status))
printf("second child died with %u\n", WTERMSIG(status));
/* prints: "second child died with 11" */
}
Как вы определяете статус выхода? Традиционно оболочка хранит только 8-битный код возврата, но устанавливает высокий бит, если процесс был аварийно завершен.
$ sh -c 'exit 42'; echo $? 42 $ sh -c 'kill -SEGV $$'; echo $? Segmentation fault 139 $ expr 139 - 128 11
Если вы видите что-то другое, то программа, вероятно, имеет SIGSEGV
] обработчик сигнала, который затем обычно вызывает exit
, так что на самом деле сигнал не убивает его. (Программы могут выбрать обработку любых сигналов, кроме SIGKILL
и SIGSTOP
.)
'1' >>> Catchall для общих ошибок
'2' >>> Неправильное использование встроенных команд оболочки (согласно документации Bash)
'126 ' >>> Вызванная команда не может выполнить
' 127 ' >>> "команда не найдена"
' 128 ' >>> Недействительный аргумент для выхода
' 128+ n ' >>> Сигнал фатальной ошибки "n"
' 130 ' >>> Скрипт завершается Control-C
' 255 ' >>> Статус выхода вне допустимого диапазона
Это для bash. Однако для других приложений существуют другие коды выхода.
Стандартных кодов выхода не существует, кроме 0, означающего успех. Ненулевое значение тоже не обязательно означает сбой.
stdlib.h действительно определяет EXIT_FAILURE
как 1 и EXIT_SUCCESS
как 0, но это все.
11 на segfault интересен, поскольку 11 - это номер сигнала, который ядро использует для остановки процесса в случае segfault. Вероятно, существует какой-то механизм, либо в ядре, либо в оболочке, который переводит это в код выхода.
sysexits.h содержит список стандартных кодов выхода. Кажется, что он датируется как минимум 1993 годом, и некоторые крупные проекты, такие как Postfix, используют его, так что я думаю, что это правильный путь.
Из справочной страницы OpenBSD:
Согласно стилю (9), это нехорошо практика вызывать exit (3) с произвольным значения trary, указывающие на состояние отказа при завершении программы. В- вместо этого следует использовать предопределенные коды выхода из sysexits, поэтому вызывающий процесс может получить приблизительную оценку класса отказа не просматривая исходный код.
Programs return a 16 bit exit code. If the program was killed with a signal then the high order byte contains the signal used, otherwise the low order byte is the exit status returned by the programmer.
How that exit code is assigned to the status variable $? is then up to the shell. Bash keeps the lower 7 bits of the status and then uses 128 + (signal nr) for indicating a signal.
The only "standard" convention for programs is 0 for success, non-zero for error. Another convention used is to return errno on error.
Стандартные коды выхода Unix определены в sysexits.h, как упоминалось на другом плакате. Те же коды выхода используются переносными библиотеками, такими как Poco - вот их список:
http://pocoproject.org/docs/Poco.Util.Application.html#16218
Сигнал 11 - это Сигнал SIGSEGV (нарушение сегмента), который отличается от кода возврата. Этот сигнал генерируется ядром в ответ на неправильный доступ к странице, что приводит к завершению программы. Список сигналов можно найти на странице руководства по сигналам (запустите "man signal").
Когда Linux возвращает 0, это означает успех. Все остальное означает сбой, каждая программа имеет свои собственные коды выхода, поэтому было бы довольно долго перечислять их все ...!
Что касается кода ошибки 11, это действительно номер ошибки сегментации, в основном это означает, что программа обратилась к ячейка памяти, которая не была назначена.
Как всегда, Advanced Bash Scripting Guide содержит полезную информацию : (Это было связано в другом ответе, но с неканоническим URL.)
1: Catchall для общих ошибок
2: Неправильное использование встроенных команд оболочки (согласно документации Bash)
126: Вызванная команда не может выполнить
127: «команда не найдена»
128: Неверный аргумент для выхода
128 + n: Сигнал фатальной ошибки «n»
255: Статус выхода вне допустимого диапазона (exit принимает только целочисленные аргументы в диапазоне 0–255)
Ссылки ABSG sysexits.h
.
В Linux:
$ find /usr -name sysexits.h
/usr/include/sysexits.h
$ cat /usr/include/sysexits.h
/*
* Copyright (c) 1987, 1993
* The Regents of the University of California. All rights reserved.
(A whole bunch of text left out.)
#define EX_OK 0 /* successful termination */
#define EX__BASE 64 /* base value for error messages */
#define EX_USAGE 64 /* command line usage error */
#define EX_DATAERR 65 /* data format error */
#define EX_NOINPUT 66 /* cannot open input */
#define EX_NOUSER 67 /* addressee unknown */
#define EX_NOHOST 68 /* host name unknown */
#define EX_UNAVAILABLE 69 /* service unavailable */
#define EX_SOFTWARE 70 /* internal software error */
#define EX_OSERR 71 /* system error (e.g., can't fork) */
#define EX_OSFILE 72 /* critical OS file missing */
#define EX_CANTCREAT 73 /* can't create (user) output file */
#define EX_IOERR 74 /* input/output error */
#define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */
#define EX_PROTOCOL 76 /* remote error in protocol */
#define EX_NOPERM 77 /* permission denied */
#define EX_CONFIG 78 /* configuration error */
#define EX__MAX 78 /* maximum listed value */