【问题标题】:Using pid passed from argv使用从 argv 传递的 pid
【发布时间】:2018-07-17 06:55:59
【问题描述】:

目前,我有一个文件调用另一个文件,并作为参数传递一个转换为字符串的 pid。然后,在信号处理程序中,我需要向 pid 给定的进程发送信号。

所以我有:

//initialized as a global variable
pid_t* distantPid;

//in my main function
distantPid = &argv[1];

//then, in my signal handler
kill(*distantPid, WARNING_SIGNAL);

不过,每当我尝试编译它时,我都会收到一条错误消息,提示“来自不兼容指针类型的分配 [默认分配]”

我不能简单地在信号处理程序中使用 argv[1],因为它不在主函数中。

我哪里错了?

【问题讨论】:

    标签: c pid


    【解决方案1】:

    您需要将字符串转换为整数。尝试类似

    //initialized as a global variable
    pid_t distant_pid;
    
    //in my main function
    long long int pid_ll = strtoll(argv[1], NULL, 0);
    distant_pid = (pid_t) pid_ll;
    
    //then, in my signal handler
    kill(distantPid, WARNING_SIGNAL);
    

    如果这是生产代码,您需要确保 strtoll() 成功;我将把它作为练习留给你……有关如何操作的信息,请参见手册页。

    【讨论】:

    • 为什么使用atoi()?当然pid_t 没有被定义为和int 一样宽? OTOH,它往往是这样的:stackoverflow.com/q/1922761/2410359
    • 我认为这是一个无符号整数,但公平点。操作系统实际上会处理环绕的值,IIRC 甚至有一种方法可以随机分配分配的 PID(可能需要内核补丁,不确定)。无论如何,是的,strtoull 可能是个好主意,我会编辑代码。
    • 也许签名:Ref
    • 啊,你是对的(POSIX:pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/…)。老实说,我不知道 PID 可能是负数,谢谢!我会再做一次编辑:)
    • 是的,整个“什么是正确的strto*”对于pid_t 等类型的使用有点棘手。一个想法是用最宽的strtoll()strtoimax() 转换字符串然后以某种待定方式缩小 - 处理溢出。另一种是比较大小或 MAX 值,然后调用“正确”strto*。我想说这个答案对于大多数情况来说已经足够好了。
    【解决方案2】:

    将字符串转换为 int 并将其传递给 kill 命令: 杀死(atoi(argv[1]), WARNING_SIGNAL);

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 2017-08-24
      • 1970-01-01
      • 2014-09-17
      • 2019-01-20
      • 1970-01-01
      • 2011-04-28
      • 2023-03-09
      • 2022-08-03
      相关资源
      最近更新 更多