如何创建具有不同名称的子进程

Nho*_*oya 1 c linux fork process

我正在使用 C,我需要创建一个名称与父进程不同的子进程(例如child_test)如何在 Linux 中使用fork()?

5go*_*der 5

您可以prctl为此使用系统调用。它有一个可怕的界面,但如果你克服了这一点,将它用于这项任务是相当直接的。这是一个最小的例子。

#include <stdio.h>      /* perror() */
#include <stdlib.h>     /* NULL */
#include <sys/prctl.h>  /* prctl(), PR_SET_NAME */
#include <sys/types.h>  /* wait() */
#include <sys/wait.h>   /* wait() */
#include <unistd.h>     /* fork(), sleep() */

int
main()
{
  const char * name = "it_worked";
  switch (fork())
    {
    case 0:
      if (prctl(PR_SET_NAME, (unsigned long) name) < 0)
        perror("prctl()");
      sleep(10);
      break;
    case -1:
      perror("fork()");
      break;
    default:
      if (wait(NULL) < 0)
        perror("wait()");
    }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我将此程序编译为一个名为的可执行文件a.out然后运行./a.out & ps,我可以观察到以下内容

#include <stdio.h>      /* perror() */
#include <stdlib.h>     /* NULL */
#include <sys/prctl.h>  /* prctl(), PR_SET_NAME */
#include <sys/types.h>  /* wait() */
#include <sys/wait.h>   /* wait() */
#include <unistd.h>     /* fork(), sleep() */

int
main()
{
  const char * name = "it_worked";
  switch (fork())
    {
    case 0:
      if (prctl(PR_SET_NAME, (unsigned long) name) < 0)
        perror("prctl()");
      sleep(10);
      break;
    case -1:
      perror("fork()");
      break;
    default:
      if (wait(NULL) < 0)
        perror("wait()");
    }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这表明显然“它有效”。

请注意,名称的最大长度限制为 16 个字节,包括终止的 NUL 字节。引用手册页:

使用 指向的位置中的值设置调用线程的名称(char *) arg2。名称最长可达 16 个字节,包括终止空字节。(如果字符串的长度(包括终止空字节)超过 16 个字节,则该字符串将被静默截断。)