在一些C项目中,我看到了这段代码:
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
(void)ud;
(void)osize;
/* some code not using `ud` or `osize` */
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
这两个演员是否有任何目的?
我正在构建的程序在无限循环中运行,其中包含一个开关盒.我想在每种情况下插入一个while循环并在循环中执行一些操作,但是一旦给出键盘输入,循环就应该退出.因此,在从键盘获取输入之后,另一个案例在其中嵌套了while循环,并且该过程继续.
结构是:
while()//infinite loop
{
............... //operations
............... //operations
switch()
{
case 1:
............... //operations
............... //operations
while()//infinite loop
{
..............
..............
exit if there is any input from keyboard
}
break;
case 2:
............... //operations
............... //operations
while()//infinite loop
{
..............
..............
exit if there is any input from keyboard
}
break;
case n:
............... //operations
............... //operations
while()//infinite loop
{
..............
..............
exit if there is any input from keyboard
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
有什么办法吗???
(在Linux中)
我找到的方法都是用的signal。
难道就没有别的办法了吗?我能做些什么来让终端将其放入输入缓冲区吗?
我们知道,在Linux-Unix的世界里,我们可以在终端中用ctrl+C来中断前台运行的程序并结束程序。
在 C++ 中我如何知道第三方破坏或强制终止 ( kill -9) 程序?
我必须经常用线程检查某些东西吗?当程序被破坏时,我必须在程序中返回退出状态 130,当程序被终止时,我必须返回退出状态 140。
我需要在SIGINT处理程序中执行清理功能,但无法将本地数据传递给它。这里是一个例子:
int main(int argc, char *argv[]) {
struct database *db = db_cursor();
sockfd_t master_socket = init_server();
signal(SIGINT, sigint_handler);
while (1) {
// accepting connections
}
}
void sigint_handler(int s) {
destroy_db(db);
shutdown(master_socket, SHUT_RDWR);
close(master_socket);
exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
我该如何实施这种行为?我试过使此变量为全局变量,但无法在编译时调用此函数(错误:initializer元素不是编译时常量)。
可能重复:
在C中捕获Ctrl-C
我正在编写一个C命令行程序,并试图确保ctrl-c不会杀死它.我怎么能这样做的想法?
我使用以下代码来捕获我的C程序中的Ctrl+ C:
void sig_handler(int signo)
{
if (signo == SIGINT)
exit(EXIT_SUCCESS);
}
void main ()
{
......
if(signal(SIGINT, sig_handler)== SIG_ERR)
{
printf(">>>>>>>>>>>>>>>>>>>>> SIG INT EROOR !!!! sigint=%d ID=%d \n",SIGINT, getpid());
}
else
printf(">>>>>>>>>>AFTER>>>>>>>>>>> SIG INT sigint=%d PID=%d \n",SIGINT, getpid());
char *buf = NULL;
asprintf(&buf, "%d", getpid());
write(fd, buf, strlen(buf));
free(buf);
uloop_run(); //entering main loop
ubus_exit();
uloop_done();
xml_exit();
config_exit();
free(tmp);
closelog();
log_message(NAME, L_NOTICE, "exiting\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的目的是捕捉Ctrl + C但似乎信号处理程序(sig_handler)不运行!怎么解决?