Внедрение EINVAL, EPERM, ESRCH в Kill () - PullRequest
0 голосов
/ 07 сентября 2010

Я пытаюсь реализовать EINVAL, EPERM, ESRCH в моей программе.

ОШИБКИ
EINVAL Указан неверный сигнал.
EPERM У процесса нет разрешения на отправкусигнал для любого из целевых процессов.ESRCH PID или группа процессов не существует.

Вот мой исходный код:

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

int main(void)
{

 int errno, pid;

 puts("Enter a process id : ");
 scanf("%d", &pid);

    errno = kill(pid, 1);

 if(errno == -1)
 {
  printf("Cannot find or kill the specified process\n");

 }


 switch(errno)
 {
  case EINVAL:
   printf("An invalid signal was specified.\n");
   break;

  case EPERM:
   printf("The process does not have permission to send the signal to any of the target processes.\n");
   break;

  case ESRCH:
   printf("The  pid or process group does not exist.");
   break;
 }

}

И когда я компилирую программу, я получаю следующие ошибки.

unipro @ ubuguest: / SoftDev / ADSD / Модуль 1 / Модуль 1 / Практика / C / C_adv / unix $ cc killApp.c -o killApp
killApp.c: в функции 'main':
killApp.c: 29: ошибка: необъявленное «EINVAL» (первое использование в этой функции)
killApp.c: 29: ошибка: (Каждый необъявленный идентификатор сообщается только один раз
killApp.c: 29: ошибка: длякаждая функция, в которой она появляется.)
killApp.c: 33: ошибка: «EPERM» необъявлена ​​(первое использование в этой функции)
killApp.c: 37: ошибка: «ESRCH» необъявлена ​​(первое использование в этой функции)
unipro @ ubuguest: / SoftDev / ADSD / Модуль 1 / Модуль 1 / Pratice / C / C_adv / unix $

Итак, где определены EINVAL, EPERM, ESRCH?Нужно ли определять какой-либо дополнительный заголовочный файл?Или я неправильно ее реализую?

Обновлен код [рабочий код]:

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

int main(void)
{

    int status, pid;

    puts("Enter a process id : ");
    scanf("%d", &pid);

    status = kill(pid, 1);



    switch(errno)
    {
        case EINVAL:
            printf("An invalid signal was specified.\n");
            break;

        case EPERM:
            printf("The process does not have permission to send the signal to any of the target processes.\n");
            break;

        case ESRCH:
            printf("The  pid or process group does not exist.");
            break;
    }

}

Спасибо.

1 Ответ

5 голосов
/ 07 сентября 2010

То, что вы пытаетесь сделать, не сработает, сначала вы должны #include <errno.h> (так как здесь определено errno, как и коды ошибок).Во-вторых, не вызывайте локальную переменную возвращаемого значения errno (так как она существует и где будет код ошибки).

например.

#include <errno.h>
/* ... */

int rc;
/* ... */

rc = kill(pid, SIGHUP);
if (rc != 0)
{
    switch (errno) {...}
}
...