Mel*_*own 2 c cpu operating-system cpu-architecture
参加操作系统课程,对于这个(和C)是新手,我真的不明白我的学习材料中陈述的事实.该程序假设暂停执行,直到发出kill-command(ctr + c或终端终止)从一开始该行是:
while (!done);
Run Code Online (Sandbox Code Playgroud)
但有人建议改变这个:
"使用while循环重复检查已完成的全局变量不是一种非常有效的CPU使用方法.更好的方法是将循环更改为:
while (pause()) {
if (done) break;
};
Run Code Online (Sandbox Code Playgroud)
"
系统在暂停期间做了什么()?如果它必须检查一个全局变量每个循环它真的可以做一些有用的事情吗?我认为pause()可能允许CPU接收其他工作,但是不检查变量毁了吗?
完整的代码如果它有帮助:
#include <stdio.h> // puts(), printf()
#include <signal.h> // SIGFPE, SIGSEGV, SIGINT
#include <stdlib.h> // exit(), EXIT_SUCCESS, EXIT_FAIURE
#include <unistd.h> // getpid(), pause()
#include <stdbool.h> // true, false
sig_atomic_t volatile done = false;
int divide_by_zero() {
int a = 1;
int b = 0;
return a / b;
}
void segfault() {
int *ptr = NULL;
*ptr = 42;
}
void signal_handler(int s) {
switch(s) {
case SIGFPE:
fputs("Caught SIGFPE: arithmetic exception, such as division by zero.\n", stderr);
exit(EXIT_FAILURE);
case SIGSEGV:
fputs("Caught SIGSEGV: segfault.\n", stderr);
exit(EXIT_FAILURE);
break;
case SIGINT:
done = true;
fputs("Caught SIGINT: interactive attention signal, probably a ctrl+c.\n", stderr);
break;
case SIGUSR1:
puts("Hello!");
break;
}
}
int main(void) {
printf("My PID = %ld\n", (long) getpid());
// Install signal handlers.
signal(SIGSEGV, signal_handler);
signal(SIGFPE, signal_handler);
signal(SIGINT, signal_handler);
signal(SIGUSR1, signal_handler);
//divide_by_zero();
//segfault();
// Wait until a signal is delivered.
while(pause()) {
if(done) break;
};
puts("I'm done!");
exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)