运行到g_main_loop_run时进程是什么情况?
时间: 2024-02-02 07:05:05 浏览: 24
当程序运行到g_main_loop_run()函数时,会启动一个主事件循环。此时程序会进入等待状态,等待Glib库中注册的事件的发生。如果没有事件发生,主事件循环会一直运行,程序会一直处于等待状态。
在主事件循环运行期间,程序会不断地处理事件。如果有事件发生,Glib库会调用相应的回调函数来处理事件,然后回到主事件循环继续等待下一个事件的发生。
在主事件循环运行期间,程序的进程状态一般是阻塞状态。也就是说,程序会停止执行,等待事件的发生。只有当事件发生时程序才会被唤醒,并执行相应的回调函数。
相关问题
glib如何使用g_main_loop_new来创建主进程
`g_main_loop_new()` 函数可以用来创建一个新的主循环,主循环可以用于事件处理和异步任务的调度。下面是一个简单的示例程序,展示如何使用 `g_main_loop_new()` 函数创建一个主进程:
```c
#include <glib.h>
static gboolean on_timeout(gpointer data)
{
g_print("Hello, world!\n");
return G_SOURCE_CONTINUE;
}
int main(int argc, char** argv)
{
GMainLoop* loop = g_main_loop_new(NULL, FALSE);
guint timeout_id = g_timeout_add_seconds(1, on_timeout, NULL);
g_print("Starting main loop...\n");
g_main_loop_run(loop);
g_source_remove(timeout_id);
g_main_loop_unref(loop);
return 0;
}
```
以上代码创建了一个主循环,并注册了一个每秒调用一次的定时器事件。`g_main_loop_run()` 函数会启动主循环,并一直运行,直到调用 `g_main_loop_quit()` 函数停止循环。在这个例子中,调用 `g_main_loop_quit()` 函数需要在 `SIGINT` 信号处理函数中执行:
```c
static void on_sigint(int signum)
{
g_print("Received SIGINT, stopping main loop...\n");
g_main_loop_quit(loop);
}
int main(int argc, char** argv)
{
// ...
signal(SIGINT, on_sigint);
// ...
}
```
这样,当用户在终端中按下 `Ctrl+C` 键时,就会触发 `SIGINT` 信号,程序会执行 `on_sigint()` 函数,从而停止主循环。
glib如何使用g_main_loop_new来创建主进程,并创建一个子线程,子线程中打印123后退出。
下面是一个示例程序,展示如何使用 `g_main_loop_new()` 函数创建主进程,并创建一个子线程,子线程中打印 `123` 并退出。
```c
#include <glib.h>
#include <stdio.h>
static gpointer thread_func(gpointer data)
{
g_print("In the thread...\n");
g_usleep(1000000);
g_print("123\n");
return NULL;
}
int main(int argc, char** argv)
{
GThread* thread;
GMainLoop* loop = g_main_loop_new(NULL, FALSE);
g_print("Creating the thread...\n");
thread = g_thread_new("my-thread", thread_func, NULL);
g_print("Starting main loop...\n");
g_main_loop_run(loop);
g_print("Waiting for the thread to finish...\n");
g_thread_join(thread);
g_main_loop_unref(loop);
return 0;
}
```
以上代码创建了一个名为 `my-thread` 的子线程,子线程中打印 `123` 并等待 1 秒钟后退出。主线程中创建了一个主循环,并启动主循环,直到调用 `g_main_loop_quit()` 函数停止循环。当主线程收到停止循环的信号时,等待子线程退出后返回。
需要注意的是,在使用 GLib 时,建议使用 GLib 提供的线程 API,而不是直接使用系统的线程 API。在本例中,可以使用 `g_thread_new()` 函数创建一个新的线程,使用 `g_thread_join()` 函数等待线程退出。这样可以保证线程和主循环之间的同步和安全。