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

Sea*_*ock 0 c unix ubuntu posix

我正在尝试在我的程序中实现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;
 }

}
Run Code Online (Sandbox Code Playgroud)

当我编译程序时,我得到以下错误.

unipro @ ubuguest:/ SoftDev/ADSD/Module 1/Unit 1/Pratice/C/C_adv/unix $ cc killApp.c -o killApp
killApp.c:在函数'main'中:
killApp.c:29:错误:'EINVAL '
unclared (首次在此函数中使用)killApp.c:29:错误:(每个未声明的标识符仅报告一次
killApp.c:29:error:对于它出现的每个函数.)
killApp.c:33:error:' EPERM'未声明(首次使用此函数)
killApp.c:37:错误:'ESRCH'未声明(首次使用此函数)
unipro @ ubuguest:/ SoftDev/ADSD/Module 1/Unit 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Has*_*kun 6

您尝试做的事情将无法工作,首先应该是#include <errno.h>(因为这errno是定义的地方,错误代码也是如此).其次,不要调用本地返回值变量errno(因为它存在并且是错误代码的位置).

例如.

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

int rc;
/* ... */

rc = kill(pid, SIGHUP);
if (rc != 0)
{
    switch (errno) {...}
}
Run Code Online (Sandbox Code Playgroud)

  • `SIGHUP`是一个信号(与代码中的`1`相同),有关errno的更多信息,请参阅http://en.wikipedia.org/wiki/Errno (2认同)