【问题标题】:how can i identify a process我如何识别一个进程
【发布时间】:2013-11-18 03:29:51
【问题描述】:

“编写一个名为 program.c 的程序,它将创建总共 9 个进程,它们将自己标识为 process0、process1、process2、process3、process4、process5、process6、process7 和 process8。原始进程应该是进程0。”

当使用 fork 创建进程时,如何将我的进程标识为“processX”,只向子进程返回 0 的 PID,向父进程返回一些数字?我以为 PID 是标识符。

【问题讨论】:

  • PID 是进程的唯一标识符。通过“识别”,您的意图是什么,将其打印出来或存储在某处等?
  • 我现在真的没有任何意图。我只是想理解赋值语句。如果获取进程身份的唯一方法是访问其 PID,我如何让进程将自己明确标识为“进程#”(0-8)?
  • 如果您打算更改进程名称并希望子进程知道相同的名称,请将 PID 到进程名称映射存储在共享表中,并对子进程具有读取权限。如果您不打算更改进程名称,请在执行期间将其作为参数传递。

标签: c process


【解决方案1】:
for (int i = 1; i < 9; i++)
{
    int pid = fork();
    if (pid < 0)
        exit(1);
    else if (pid == 0)
    {
        printf("Process%d\n", i);
        exit(0);
    }
}
printf("Process%d\n", 0);

【讨论】:

  • 哦,所以我只是明确地创建了这个标识符......太简单了,谢谢!
【解决方案2】:

如果你使用Unix获取当前进程的PID,你可以使用getpid()

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);

【讨论】:

  • 好吧,如果你需要像process0..8一样打印,那么你可以在父进程中打印“process0”和“process” getpid() - getppid()。这个值不能保证是必然的,因为其他进程可以同时产生。另一种解决方案可能涉及 getpgid() 调用。
【解决方案3】:

至少在 Linux 上,您可以通过更改 argv[0] 来更改进程名称。编译program.c时,将可执行文件命名为process0。分叉的进程可以将每个strcpy() 的新名称转换为argv[0],只要新名称不超过原始名称的大小即可。 (跟踪哪个进程得到哪个名称留给读者作为练习。)

【讨论】:

  • 这真的很有趣。很高兴知道这是可能的。
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2019-09-15
  • 2013-09-05
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
相关资源
最近更新 更多