You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言使用两个变量实现向指定进程发送信号的代码正确性及优化咨询

代码问题排查

现有代码存在多个致命错误,无法正常编译或运行:

  • 变量声明语法错误:pid_t pid, int signo; 写法不合法,同一行不能混合声明两种不同类型的变量,需要拆分两行编写:
    pid_t pid;
    int signo;
    
  • 成功路径返回值错误:信号发送成功后错误返回了EXIT_FAILURE,应该改为EXIT_SUCCESS
  • 错误提示缺失换行:校验pid和信号编号合法性的printf输出末尾没有加\n,会导致输出缓冲区不刷新,内容无法正常打印
  • 拼写错误:成功提示里的Succesfully拼写错误,正确写法是Successfully
可优化点
  • 错误信息输出到标准错误流:所有错误提示应该用fprintf(stderr, ...)而不是printf,符合Linux程序的流规范,方便用户过滤正常输出和错误信息
  • 输出具体错误原因:kill调用失败时,用perror打印系统级错误原因(比如权限不足、目标进程不存在等),比固定提示更友好
  • 优化输入校验逻辑:atoi无法识别非数字输入、整数溢出的场景,比如输入abc会返回0被现有逻辑拦截,但如果输入超出int范围的数字会溢出得到非法值,如果要更严谨可以替换为strtol做合法校验,题目要求用atoi的话可以保留现有逻辑
  • 可以补充信号范围校验:判断signo < NSIG,避免传入系统不支持的信号编号
优化后的完整代码
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    pid_t pid;
    int signo;
  
    if (argc != 3) 
    {
        fprintf(stderr, "用法: %s <pid> <信号编号>\n", argv[0]);
        return EXIT_FAILURE;
    }
    
    pid = atoi(argv[1]); 
    signo = atoi(argv[2]);
    
    if (pid < 1 || signo < 1)
    {
        fprintf(stderr, "错误:pid和信号编号必须都大于0\n");
        return EXIT_FAILURE;
    }

    if (kill(pid, signo) < 0) {
        fprintf(stderr, "向进程%d发送信号%d失败: ", pid, signo);
        perror("");
        return EXIT_FAILURE;
    }
    printf("成功向进程%d发送信号%d\n", pid, signo);
    return EXIT_SUCCESS;
}

内容的提问来源于stack exchange,提问作者alexherbst1888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:36:03