LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1716|回复: 7

请问,内核中结构体变量为什么可以这样写 struct task_struct *p; *p = *current;

[复制链接]
发表于 2008-7-23 15:50:31 | 显示全部楼层 |阅读模式
请问,内核中结构体变量为什么可以这样写 struct task_struct *p;  *p = *current;
int do_fork(unsigned long clone_flags, unsigned long stack_start,
            struct pt_regs *regs, unsigned long stack_size)
{
        int retval = -ENOMEM;
        struct task_struct *p;
        DECLARE_MUTEX_LOCKED(sem);

        if (clone_flags & CLONE_PID) {
                /* This is only allowed from the boot up thread */
                if (current->pid)
                        return -EPERM;
        }
       
        current->vfork_sem = &sem;

        p = alloc_task_struct();
        if (!p)
                goto fork_out;
[color="Red"]
        *p = *current;
发表于 2008-7-23 17:16:37 | 显示全部楼层
因为需要拷贝task_struct阿
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-24 09:54:38 | 显示全部楼层
再请问下。在应用程序中,结构体的拷贝是通过 memcpy 来实现。难道在内核中它可以直接用 “ = ”来拷贝相同类型的结构体 ?  我只知道到 C++可以重载 "="  来达到该目的。
回复 支持 反对

使用道具 举报

发表于 2008-7-24 10:54:26 | 显示全部楼层
楼主只要考虑这样一个问题就可以了

  1. struct T {
  2.   int x, y;
  3. };

  4. struct T a, b;

  5. a = b;
复制代码

楼主认为这是否合乎语法呢?

再考虑一个问题

  1. struct T {
  2.   int x, y;
  3. };

  4. void fn1(struct T a)
  5. {
  6.     printf("%d\n", a.x);
  7. }
  8. void fn2(struct T * p)
  9. {
  10.     printf("%d\n", p->x);
  11. }
复制代码

一般都会建议使用 fn2 的形式, 而不是 fn1, 楼主想想这是为什么?

最后再想一想, 下面的例子中, fn1 和 fn2 是否能够达到预期的效果, 为什么?

  1. struct T {
  2.   int x, y;
  3. };

  4. void fn1(struct T a)
  5. {
  6.     a.x = 0;
  7. }
  8. void fn2(struct T * p)
  9. {
  10.     p->x = 0;
  11. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-24 14:35:42 | 显示全部楼层
上面的代码我多试过了,确实可以直接赋值。 建议使用 fn2 的形式, 而不是 fn1, 是因为实参传递给行参时,使用指针能节省空间和时间。fn2只要把指针赋值给行参,而fn1却要把 Struct T赋值给行参。

在此谢谢 两位。
回复 支持 反对

使用道具 举报

发表于 2008-8-12 17:04:49 | 显示全部楼层
=是赋值,就是内存拷贝,无论C和C++都可以直接用。
C++会为每一个类自动生成=

==是没有的
回复 支持 反对

使用道具 举报

发表于 2008-8-12 17:07:26 | 显示全部楼层
另外回复5楼,
void fn1(struct T a)
{
    a.x = 0;
}
这个不仅仅是性能的问题,这种做法是错的,因为a在fn1的栈上(复制的),不可能传出去。

在c++中用得是拷贝构造
回复 支持 反对

使用道具 举报

发表于 2009-3-1 15:41:45 | 显示全部楼层
其实*q = *current;就相当于memcpy(current, q, sizeof(struct task_struct));
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表