为什么task_struct中的进程状态存储为类型' long'?

时间:2015-11-08 12:46:46

标签: linux-kernel

在Linux内核树中,文件/include/linux/sched.h包含task_struct,除其他数据外,还包含变量volatile long state

根据this pagestate中存储的数字代表五种状态之一:

#define TASK_RUNNING            0
#define TASK_INTERRUPTIBLE      1
#define TASK_UNINTERRUPTIBLE    2
#define TASK_ZOMBIE             4
#define TASK_STOPPED            8

我的问题如下:

为什么这么大的数据类型用于存储状态?单个字节不足以存储上述状态吗?当然,long未被选中以预期数千/数百万个可能的州?

我知道long的定义会因不同的架构而异,但我认为char已经足够了。

1 个答案:

答案 0 :(得分:1)

您可以轻松地看到这些值是2的幂。这是处理/ flags /的标准方法。您可以逻辑OR(' |')它们来创建cobined状态。然后,您可以使用AND('&')轻松测试它们。

长在32位平台上只会是32位。

因此,在32位平台上,只有32个不同的标志,而不是数百万个。

最后,我强烈建议检查实际来源,最好是从这十年开始,请参阅:

#define TASK_KILLABLE           (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)

并在下面标记用法,例如

        public static void Email(string name, string recipient, string address, string email, string info)
    {
        MailMessage mailMsg = new MailMessage();
        mailMsg.To.Add(new MailAddress(email));
        // From
        MailAddress mailAddress = new MailAddress("user@live.com");
        mailMsg.From = mailAddress;

        //Content
        mailMsg.Subject = "Secret Santa";
        mailMsg.Body = name + ", your target is " + recipient + ". Please spread the holiday cheer with a soft cap of $20! From an automated mail service";

        //SmtpClient
        SmtpClient smtpConnection = new SmtpClient("smtp.live.com", 587);
        smtpConnection.Credentials = new System.Net.NetworkCredential("user@live.com", "password");
        smtpConnection.UseDefaultCredentials = true;

        smtpConnection.EnableSsl = true;
        smtpConnection.DeliveryMethod = SmtpDeliveryMethod.Network;
        smtpConnection.Send(mailMsg);
    }

所以,问题是为什么这会长而不是int。我不知道,但不太可能有任何特别好的理由。