我读了一些代码如下:
void
mcachefs_file_start_thread()
{
pthread_attr_t attrs;
pthread_attr_init(&attrs);
pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_JOINABLE);
pthread_create(&mcachefs_file_threadid, &attrs, mcachefs_file_thread, NULL);
}
Run Code Online (Sandbox Code Playgroud)
在这里,设置的用法attrs是PTHREAD_CREATE_JOINABLE什么?此外,它不是由pthead_create?创建的线程的默认属性?
假设我有一个带有GCC构造函数的libA.so.
我的程序"程序"依赖于libA.so,所以当我运行它时,libA.so被打开并且它的构造函数被执行.现在,我还有一个模块libC.so,它也依赖于libA.我跑dlopen("libC.so"),加载libC,并根据我的实验,也执行libA的构造函数.
依赖关系看起来像这样:
现在,当我运行程序时:
显然,当它们被加载到内存中时,dlopen会执行库的构造函数.这是在某处指定的,链接器如何检查哪些库已经加载?
(为什么我要问:在一个场合,我在一些未完全理解的情况下得到了一个两次执行的构造函数.我是否正确地假设这完全被破坏并且在正常情况下不应该发生?)
我正在开发一种RTSP服务器,该服务器应模拟实时源,同时从文件流式传输数据。
我目前拥有的大部分内容都基于gst-rtsp-server示例test-readme.c,仅具有以下管道:
gst_rtsp_media_factory_set_launch(factory, "( "
"filesrc location=stream.mkv ! matroskademux name=demuxer "
"demuxer. ! queue ! rtph264pay name=pay0 pt=96 "
"demuxer. ! queue ! rtpmp4gpay name=pay1 pt=97 "
")");
Run Code Online (Sandbox Code Playgroud)
除一个问题外,此方法效果很好:当RTSP客户端(使用RTSP / TCP交错传输)无法接收数据时,整个管道将锁定,直到客户端再次准备好,然后恢复到原始位置而不会任何跳跃。
由于我想模拟无法无限期缓冲其视频的实时源,因此在这种情况下,所需的行为是继续播放文件,因此当客户端阻塞5秒钟时,它将损失5秒钟的录制时间。
我试图通过限制队列大小并将其设置为泄漏(通过将其设置为)来实现此目的(通过将设置为queue max-size-bytes=1000000 max-size-time=1000000000 leaky=upstream,这应该为大约1秒的视频提供缓冲,但不再提供)。这并没有完全按照我希望的那样工作:信号源和多路分解器填满了队列,然后在0.1秒内将其完全清空。
我认为我需要某种方法来限制队列之前的管道吞吐量,方法是将解复用器限制为实时解复用,或者找到/制作一个gstreamer过滤器,以使每1秒钟的实时数据通过1秒钟。
您对此有任何提示吗?
我想在main.c中使用来自foo.c的变量a,我写道:
foo.c
#include <stdio.h>
int a[] = {3, 2};
void foo()
{
printf("foo\taddress of a:%x\n", a);
printf("foo\tvalue of a[0]:%x\n", a[0]);
}
main.c
#include <stdio.h>
extern int *a;
int main(void)
{
foo();
printf("main\taddress of a : %x\n", a);
printf("main\tvalue of a[0] : %x\n", a[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和结果输出:
foo address of a:804a014
foo value of a[0]:3
main address of a : 3
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
为什么?
gcc (GCC) 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)
你好,
我在service.h文件中有以下内容
enum service_state_code {
NO_ERROR_OK,
ERROR_INCORRECT_STATE,
ERROR_EMPTY_STRING,
ERROR_NO_COMMAND_FOUND
};
const char *service_state_msg[] = {
"OK:",
"ERROR: Incorrect state for modifying service channel state",
"ERROR: No command found",
"ERROR: No command parameters",
NULL
};
get_channel_service_state(channel_t *channel, const char *msg);
Run Code Online (Sandbox Code Playgroud)
我还有另外两个*.c文件,其中包含service.h文件.
network.c 和 socket.c
我用它是这样的:
get_channel_service_state(channel, ss7_service_state_msg[ERROR_INCORRECT_STATE]);
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个链接器错误抱怨:
multiple definition of service_state_msg first defined here
Run Code Online (Sandbox Code Playgroud)
我知道我收到此错误的原因.因为service_state_msg每次将它包含在*.c文件中时,它被定义为service.h中的全局变量.
我只想询问service_state_msg在多个*.c源文件中使用的最佳方法是什么?
非常感谢任何建议,
当我尝试编译一个小的lua程序时,我得到这些错误:
/usr/lib//liblua52.so: undefined reference to `dlsym'
/usr/lib//liblua52.so: undefined reference to `dlerror'
/usr/lib//liblua52.so: undefined reference to `dlopen'
/usr/lib//liblua52.so: undefined reference to `dlclose'
Run Code Online (Sandbox Code Playgroud)
当然,我用-ldl链接.我在我的ubuntu上安装了lua5.2-dev.如果您需要更多信息,请问我.
谢谢!