在Kill()中实现EINVAL,EPERM,ESRCH

时间:2010-09-07 12:30:22

标签: c unix ubuntu posix

我正在尝试在我的程序中实现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 / Pratice / C / C_adv / unix $ cc   killApp.c -o killApp
killApp.c:In   function'main':
killApp.c:29:   错误:'EINVAL'未声明(首次使用   在这个函数中)
killApp.c:29:   错误:(每个未声明的标识符是   只报了一次
killApp.c:29:   错误:对于它出现的每个功能   in。)
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 个答案:

答案 0 :(得分:5)

你要做的事情是行不通的,首先你应该#include <errno.h>(因为那里定义了errno,错误代码也是如此)。 其次,不要调用本地返回值变量errno(因为它存在并且是错误代码的位置)。

例如

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

int rc;
/* ... */

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