作业:
1. 守护进程
2. 打印时钟在终端上,若终端输入quit,结束时钟
1.代码
pid_t cpid = fork();
if (0 == cpid)
{
//创建新的会话
pid_t sid = setsid();
printf("sid = %d\n", sid);
//修改运行目录为不可卸载的文件目录
chdir("/");
//清空文件权限掩码
umask(0);
//关闭所有文件描述符
for (int i = 0; i < getdtablesize(); i++)
{
close(i);
}
while (1)
{
//守护进程运行的周期代码
sleep(1);
}
}
结果
2.代码
int main(int argc, const char *argv[])
{
pid_t cpid = fork();
if (cpid > 0)
{
printf("按回车会暂停时间\n");
time_t t2;
struct tm *info = NULL;
while (1)
{
t2 = time(NULL);
info = localtime(&t2);
printf("%4d-%02d-%02d %02d:%02d:%02d\r", \
info -> tm_year + 1900, info -> tm_mon + 1, \
info -> tm_mday, info -> tm_hour, info -> tm_min, \
info -> tm_sec);
fflush(stdout);
pid_t wpid = waitpid(cpid, NULL, WNOHANG);
if (wpid == -1)
{
char s[20] = "";
char c[] = "quit";
printf("时间已暂停,请输入 quit 退出时钟\n");
gets(s);
if (strcmp(s, c) == 0)
{
return -1;
}
else
{
continue;
}
}
else if (wpid > 0)
{
char s[20] = "";
char c[] = "quit";
printf("时间已暂停,请输入 quit 退出时钟\n");
gets(s);
if (strcmp(s, c) == 0)
{
return 0;
}
else
{
continue;
}
}
}
}
else if (0 == cpid)
{
char s = 0;
char c = '\n';
while (1)
{
s = getchar();
if (c == s)
{
exit(0);
}
}
}
else
{
ERR_MSG("fork");
return -1;
}
return 0;
}
结果