【问题标题】:Implementing EINVAL, EPERM, ESRCH in Kill()在 Kill() 中实现 EINVAL、EPERM、ESRCH
【发布时间】:2010-09-07 12:30:22
【问题描述】:

我正在尝试在我的程序中实现 EINVAL、EPERM、ESRCH。

ERRORS
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/Module 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/练习/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;
    }

}

谢谢。

【问题讨论】:

  • 您可能应该使用strerrorperror 来获取错误消息,而不是自己编写。它更简单、更简洁,并且在许多系统上,它可以免费翻译成用户的母语。

标签: c unix ubuntu posix


【解决方案1】:

您尝试执行的操作不起作用,首先您应该#include &lt;errno.h&gt;(因为这是定义errno 的地方,错误代码也是如此)。 其次,不要调用本地返回值变量 errno(因为它存在并且是错误代码所在的位置)。

例如。

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

int rc;
/* ... */

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

【讨论】:

  • 什么是 SIGHUP?是信号吗?
  • SIGHUP 是一个信号(与代码中的 1 相同),有关 errno 的更多信息,请参阅en.wikipedia.org/wiki/Errno
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多