如何创建具有不同名称的子进程
How to create a child process with a different name
我正在使用 C,我需要创建一个名称不同于父进程的子进程(例如 child_test
)如何在 Linux 和 fork()
中做到这一点?
您可以为此使用 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;
}
如果我将此程序编译为名为 a.out
的可执行文件,然后 运行 ./a.out & ps
,我可以观察到以下内容
PID TTY TIME CMD
7462 pts/7 00:00:00 bash
7741 pts/7 00:00:00 a.out
7742 pts/7 00:00:00 it_worked
7743 pts/7 00:00:00 ps
这表明显然“有效”。
请注意,名称的最大长度限制为 16 个字节,包括终止 NUL 字节。引用手册页:
Set the name of the calling thread, using the value in the location pointed to by (char *) arg2
. The name can be up to 16 bytes long, including the terminating null byte. (If the length of the string, including the terminating null byte, exceeds 16 bytes, the string is silently truncated.)
我正在使用 C,我需要创建一个名称不同于父进程的子进程(例如 child_test
)如何在 Linux 和 fork()
中做到这一点?
您可以为此使用 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;
}
如果我将此程序编译为名为 a.out
的可执行文件,然后 运行 ./a.out & ps
,我可以观察到以下内容
PID TTY TIME CMD
7462 pts/7 00:00:00 bash
7741 pts/7 00:00:00 a.out
7742 pts/7 00:00:00 it_worked
7743 pts/7 00:00:00 ps
这表明显然“有效”。
请注意,名称的最大长度限制为 16 个字节,包括终止 NUL 字节。引用手册页:
Set the name of the calling thread, using the value in the location pointed to by
(char *) arg2
. The name can be up to 16 bytes long, including the terminating null byte. (If the length of the string, including the terminating null byte, exceeds 16 bytes, the string is silently truncated.)