小编che*_*che的帖子

pthread中PTHREAD_CREATE_JOINABLE的用法是什么?

我读了一些代码如下:

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)

在这里,设置的用法attrsPTHREAD_CREATE_JOINABLE什么?此外,它不是由pthead_create?创建的线程的默认属性?

c pthreads

7
推荐指数
1
解决办法
1万
查看次数

什么时候gcc __attribute __((构造函数))运行?

假设我有一个带有GCC构造函数的libA.so.

我的程序"程序"依赖于libA.so,所以当我运行它时,libA.so被打开并且它的构造函数被执行.现在,我还有一个模块libC.so,它也依赖于libA.我跑dlopen("libC.so"),加载libC,并根据我的实验,也执行libA的构造函数.

依赖关系看起来像这样:

  • libA有构造函数
  • libB也有一个构造函数
  • libC依赖于libA和libB
  • 程序取决于libA
  • 程序通过dlopen()链接libC

现在,当我运行程序时:

  • libA的构造函数在main()启动之前运行
  • libB的构造函数由dlopen()运行

显然,当它们被加载到内存中时,dlopen会执行库的构造函数.这是在某处指定的,链接器如何检查哪些库已经加载?

(为什么我要问:在一个场合,我在一些未完全理解的情况下得到了一个两次执行的构造函数.我是否正确地假设这完全被破坏并且在正常情况下不应该发生?)

c gcc posix shared-libraries dlopen

7
推荐指数
1
解决办法
1130
查看次数

限制gstreamer管道吞吐量以模拟实时源

我正在开发一种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秒钟。

您对此有任何提示吗?

streaming rtsp gstreamer

5
推荐指数
1
解决办法
1675
查看次数

这个使用extern关键字的C程序有什么问题?

我想在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)

为什么?

c

5
推荐指数
1
解决办法
188
查看次数

在多个源文件中声明变量

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.csocket.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源文件中使用的最佳方法是什么?

非常感谢任何建议,

c

4
推荐指数
1
解决办法
110
查看次数

静态变量存储

在C中,存储在内存中的静态变量在哪里?假设有两个静态变量,一个是函数局部变量,另一个是全局变量.如何在符号表中保留此条目?请解释.

c

2
推荐指数
1
解决办法
1181
查看次数

Lua编译链接错误

当我尝试编译一个小的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.如果您需要更多信息,请问我.

谢谢!

linker lua compiler-errors

1
推荐指数
1
解决办法
1449
查看次数