在Linux内核树中,文件/include/linux/sched.h
包含task_struct
,除其他数据外,还包含变量volatile long state
。
根据this page,state
中存储的数字代表五种状态之一:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 4
#define TASK_STOPPED 8
我的问题如下:
为什么这么大的数据类型用于存储状态?单个字节不足以存储上述状态吗?当然,long
未被选中以预期数千/数百万个可能的州?
我知道long
的定义会因不同的架构而异,但我认为char
已经足够了。
答案 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。我不知道,但不太可能有任何特别好的理由。