是否应该释放传递给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()
的字符串。如果线程的名称没有更改,则必须进行复制。可能的复制