是否应该释放传递给prctl()的内存?

是否应该释放传递给prctl()的内存?,c,linux,C,Linux,我正在使用prctl()更改C中的pthreads线程名称: // Set our thread name to assist with debugging a running process char *threadName = calloc(16, sizeof(char)); sprintf(threadName, "My Own Thread"); prctl(PR_SET_NAME, threadName); 我的问题是,我是否应该在调用prctl()之后立即释放ch

我正在使用
prctl()
更改C中的pthreads线程名称:

  // Set our thread name to assist with debugging a running process
  char *threadName = calloc(16, sizeof(char));
  sprintf(threadName, "My Own Thread");
  prctl(PR_SET_NAME, threadName);
我的问题是,我是否应该在调用
prctl()
之后立即释放
char*threadName

prcrl()
是否获取字符串param的安全副本,允许我随时释放提供的变量

使用valgrind进行内存测试时,不会突出显示任何问题。我担心的是导致难以跟踪并发性/内存问题


编辑:我不相信建议的问题回答了这里关于系统/内核函数的具体问题,特别是
prctl()
要求调用者不要释放提供的内存。

是的,一般来说,如果需要,标准函数会在返回之前复制缓冲区,将原始传递的缓冲区的所有权留给调用函数。

是的,一般来说,如果需要,标准函数将在返回之前复制缓冲区,将原始传递的缓冲区的所有权留给调用函数。

我找不到任何明确说明释放传递给
prctl的字符串是安全的文档(PR_SET_NAME,NAME)
(它很可能存在于某个地方)

对手册页、glibc源代码和Linux内核源代码的检查表明,在调用
prctl()
后释放内存是安全的

PR\u SET\u NAME
声明此项:

PR\u SET\u名称(自Linux 2.6.9起)

使用中的值设置调用线程的名称
(char*)arg2
指向的位置。名称最多可为 16字节长,包括终止的空字节。(如果 字符串的长度,包括终止的空字节, 超过16个字节,字符串将被静默截断。)这是 可以通过
pthread\u setname\u np(3)
并使用
pthread\u getname\u np(3)
进行检索 同样可以通过
/proc/self/task/[tid]/comm
访问,其中
tid
是调用线程的名称

这里的关键是语句“属性同样可以通过
/proc/self/task/[tid]/comm
访问”。这意味着必须将提供的字符串复制到内核空间中。“使用
(char*)arg2
指向的位置中的值”当然,这看起来确实令人困惑和不清楚,这使得传递给
prctl()
的字符串可能被直接使用。但要“通过
/proc/…
访问”,需要在内核空间中创建一个副本

这有点难理解。我无法确定地找到进程调用
prctl()
时执行的实际代码,但我找到的是直接将指针传递到内核的系统调用

当字符串从用户空间复制到内核空间时:

case PR_SET_NAME:
    comm[sizeof(me->comm) - 1] = 0;
    if (strncpy_from_user(comm, (char __user *)arg2,
                  sizeof(me->comm) - 1) < 0)
        return -EFAULT;
    set_task_comm(me, comm);
    proc_comm_connector(me);
    break;
case PR\u SET\u NAME:
comm[sizeof(me->comm)-1]=0;
如果(strncpy_from_user)(comm,(char_user*)arg2,
大小(me->comm)-1)<0)
返回-默认值;
设置任务通信(me,通信);
过程通信连接器(me);
打破

一个确定的测试是调用
prctl()
来设置名称,然后修改传递给
prctl()
的字符串。如果线程的名称没有更改,则必须进行复制。

我找不到任何文档明确说明释放传递给
prctl的字符串是安全的(PR\u set\u name,name)
(它很可能存在于某个地方)

对手册页、glibc源代码和Linux内核源代码的检查表明,在调用
prctl()
后释放内存是安全的

PR\u SET\u NAME
声明此项:

PR\u SET\u名称(自Linux 2.6.9起)

使用中的值设置调用线程的名称
(char*)arg2
指向的位置。名称最多可为 16字节长,包括终止的空字节。(如果 字符串的长度,包括终止的空字节, 超过16个字节,字符串将被静默截断。)这是 可以通过
pthread\u setname\u np(3)
并使用
pthread\u getname\u np(3)
进行检索 同样可以通过
/proc/self/task/[tid]/comm
访问,其中
tid
是调用线程的名称

这里的关键是语句“属性同样可以通过
/proc/self/task/[tid]/comm
访问”。这意味着必须将提供的字符串复制到内核空间中。“使用
(char*)arg2
指向的位置中的值”“当然,这看起来令人困惑和不清楚,这使得传递给
prctl()
的字符串可能被直接使用。但要“通过
/proc/…
访问”,需要在内核空间中创建一个副本

这有点难理解。我无法确定地找到进程调用
prctl()
时执行的实际代码,但我找到的是直接将指针传递到内核的系统调用

当字符串从用户空间复制到内核空间时:

case PR_SET_NAME:
    comm[sizeof(me->comm) - 1] = 0;
    if (strncpy_from_user(comm, (char __user *)arg2,
                  sizeof(me->comm) - 1) < 0)
        return -EFAULT;
    set_task_comm(me, comm);
    proc_comm_connector(me);
    break;
case PR\u SET\u NAME:
comm[sizeof(me->comm)-1]=0;
如果(strncpy_from_user)(comm,(char_user*)arg2,
大小(me->comm)-1)<0)
返回-默认值;
设置任务通信(me,通信);
过程通信连接器(me);
打破
一个确定的测试是调用
prctl()
来设置名称,然后修改传递给
prctl()
的字符串。如果线程的名称没有更改,则必须进行复制。

可能的复制