Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C libev中fork后的分段错误_C_Linux_Fork_Libev - Fatal编程技术网

C libev中fork后的分段错误

C libev中fork后的分段错误,c,linux,fork,libev,C,Linux,Fork,Libev,我想用libev制作一个示例应用程序。我想在键盘输入上有一个监视程序,它可以解析几个命令,比如“开始”、“停止”和“退出”。在“开始”时,我想创建一个管道并分叉应用程序,以在一个子系统中启动一些辅助程序(如ffmpeg,使用exec()或只是一些打印一些字符的循环),并在父系统中的该管道上设置一个监视程序,以将输出打印到控制台。在“停止”命令下,我想杀死一个孩子并移除一个观察者 我已经实现了这个程序,但在fork之后,当孩子在跑步时,我总是在键盘输入上出现segfault 起初我认为,因为ifS

我想用
libev
制作一个示例应用程序。我想在键盘输入上有一个监视程序,它可以解析几个命令,比如“开始”、“停止”和“退出”。在“开始”时,我想创建一个管道并分叉应用程序,以在一个子系统中启动一些辅助程序(如
ffmpeg
,使用
exec()
或只是一些打印一些字符的循环),并在父系统中的该管道上设置一个监视程序,以将输出打印到控制台。在“停止”命令下,我想杀死一个孩子并移除一个观察者

我已经实现了这个程序,但在fork之后,当孩子在跑步时,我总是在键盘输入上出现segfault

起初我认为,因为if
STDIN
可以在孩子和家长之间共享。我已尝试分离child,关闭child中的
STDIN
。然后我尝试了
dup
STDIN
并在开始时关闭父级中的默认
STDIN
,并在复制的
STDIN
上设置了一个监视程序。我还尝试在分叉之前关闭
STDOUT/ERR
描述符,并在分叉之后在父级中恢复它们

我在
user\u input
回调中停止并启动
user\u input
观察程序,以防这有所帮助

然后我尝试在子循环中执行
ev\u default\u fork()
ev\u loop\u fork()
(这不是必需的,因为我想在fork之后执行
exec()
,或者在任何情况下,子循环都不会得到控制),但没有成功

我还尝试使用不同的后端(
select
而不是
epoll

我还试图忽略一些信号,比如
SIGHUP
SIGPIPE
SIGCHILD


我还注意到,我在
fork()
之后的输入会导致segfault和bash将其作为命令获取,因此如果我这样做(用“>”表示手写输入,用“Ok”。有一段时间gdb解决了这个问题。我发现我的代码中有两个错误与libev或fork没有直接联系

导致这种奇怪行为的问题是我的错误输入,由于我的疏忽,我没有注意到。我将标准
ev_io
结构分为子类,但出于某种原因,我做了以下操作:

typedef struct lee_user_input_event_t{
    struct ev_io *event;
    struct lee_process_data_t *child_process_data;
...
};
与此相反:

typedef struct lee_user_input_event_t{
    struct ev_io event;
    struct lee_process_data_t *child_process_data;
...
}
因此,将回调中的事件指针投射到我自己的结构是一场彻底的灾难

typedef struct lee_user_input_event_t{
    struct ev_io *event;
    struct lee_process_data_t *child_process_data;
...
};
typedef struct lee_user_input_event_t{
    struct ev_io event;
    struct lee_process_data_t *child_process_data;
...
}