如果我为SIGABRT设置和信号处理程序,同时我有一个线程在SIGBRT上等待sigwait()(我通过pthread_sigmask在其他线程中有一个阻塞的SIGABRT).
那么首先处理哪一个?信号处理程序或sigwait()?
[我正面临一些问题,sigwait()永远被阻止.我正在调试它]
main()
{
sigset_t signal_set;
sigemptyset(&signal_set);
sigaddset(&signal_set, SIGABRT);
sigprocmask(SIG_BLOCK, &signal_set, NULL);
// Dont deliver SIGABORT while running this thread and it's kids.
pthread_sigmask(SIG_BLOCK, &signal_set, NULL);
pthread_create(&tAbortWaitThread, NULL, WaitForAbortThread, NULL);
..
Create all other threads
...
}
static void* WaitForAbortThread(void* v)
{
sigset_t signal_set;
int stat;
int sig;
sigfillset( &signal_set);
pthread_sigmask( SIG_BLOCK, &signal_set, NULL ); // Dont want any signals
sigemptyset(&signal_set);
sigaddset(&signal_set, SIGABRT); // Add only SIGABRT
// This thread while executing , will handle the SIGABORT signal via …Run Code Online (Sandbox Code Playgroud) 我知道SIGCONT继续之前由SIGSTOP停止的进程.没有SIGSTOP,我可以多次使用SIGCONT吗?我,e,以下序列有效吗?
SIGSTOP to process A : The process stops
SIGCONT to process A : Process resumes
SIGCONT to process A : Process already runs - this SIGCONT has no effect
SIGCONT to process A : Process already runs - this SIGCONT has no effect
...
SIGSTOP to process A : The process stops
SIGCONT to process A : Process resumes
Run Code Online (Sandbox Code Playgroud) 播放两个独立波形文件所需的API配置/调用是什么?我试图这样做,我得到资源忙的错误.一些解决问题的指针将非常有帮助.
以下是snd_pcm_prepare()第二个wavefile 的错误消息
"Device or resource busy"
Run Code Online (Sandbox Code Playgroud) 我正在非交错模式下播放单声道音频.当我将音频数据写入扬声器时,我得到了不足:ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred
我是这样写的:
printf("%d",snd_pcm_avail (spkhandle));
ret = snd_pcm_writen(spkhandle, pSpeakerBuf , framesIn18Millisec);
if(ret < 0)
{
snd_pcm_recover(spkhandle, ret, 0);
}
Run Code Online (Sandbox Code Playgroud)
有什么不同的方法/参数配置可以防止运行中的ALSA?
(我使用的是Linux 3.0,ARM)
编辑:这是使用snd_pcm_avail()API的缓冲区测量
snd_pcm_avail = 2304 << snd_pcm_writen call 1 success
snd_pcm_avail = 2160 << snd_pcm_writen call 2 success
snd_pcm_avail = 2016 << snd_pcm_writen call 3 success
snd_pcm_writen error -32 Broken pipe << snd_pcm_writen call 4 failure
ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred << And displays this message
Run Code Online (Sandbox Code Playgroud)
以下是Marko要求的输出:
snd_output_t* out;
....
// Do alsa parameters init …Run Code Online (Sandbox Code Playgroud) 我遇到了以下信号处理程序代码,它存储 errno 变量,以便它不会影响主线程的 errno 处理。
void myhandler(int signo)
{
int esaved;
esaved = errno;
write(STDOUT_FILENO, "Got a signal\n", 13);
errno = esaved;
}
Run Code Online (Sandbox Code Playgroud)
但这真的能达到目的吗?如果另一个线程在 write() 之后和恢复 errno 之前检查共享 errno 变量,会发生什么?该线程会由于竞争条件而获得错误的 errno 值吗?
或者信号处理程序相对于线程/进程以原子方式执行,因此一旦信号处理程序执行,内核就不会调度线程,直到信号处理程序完成为止?
换句话说 - 一旦启动,信号处理程序是否会执行而不会被以下情况中断:
- 1) Scheduler (process/threads), or
- 2) Other signals, or
- 3) Hardware interrupt handlers ?
Run Code Online (Sandbox Code Playgroud) 我有一个带有麦克风和扬声器的音频会议设备。麦克风和扬声器都具有相同的采样率,snd_pcm_hw_params_set_rate_near()比如 8000 Hz。我是否需要将两者的周期大小和周期数设置为相同(两个这样的设备相互通信)?
或者我可以为扬声器选择不同的周期/周期大小而不是为麦克风配置的周期/周期大小吗?我如何决定使用哪个周期和周期大小?
我使用snd_pcm_hw_params_set_period_size_near()和snd_pcm_hw_params_set_periods_near()API来设定周期的大小和周期扬声器和麦克风。
(我是 ALSA 的新手)。
设备“默认”与“hw:0,0”之间有什么区别?他们是一样的吗?
(背景:当我配置 hw:0,0 时,我在播放音频时遇到了一些麻烦,但“默认”有效。找不到导致此问题的原因)
谢谢
惠普手册页(链接)说
"默认情况下,新线程的调度策略和优先级是从创建线程继承的 - 也就是说,默认情况下,pthread_create(3)例程忽略在指定线程属性对象中设置的调度策略和优先级.因此,要创建在调用pthread_create(3)之前,一个受调度策略和优先级设置在指定线程属性对象中的线程,程序必须使用pthread_attr_setinheritsched(3)例程将继承线程
属性对象的调度属性设置为PTHREAD_EXPLICIT_SCHED."
这适用于Linux posix线程(NPTL pthread)吗?
如果没有,影响使用pthread_create()创建的线程的优先级和调度策略的因素是什么?
最近我得到了一个测试二进制文件。当我使用 objdump 检查它时,我观察到它包含硬编码的库路径。为什么需要像这样对路径进行硬编码?路径不应该取自 SHELL 环境变量或 -L 参数吗?
objdump -p 测试程序
输出包括共享库的硬编码路径:
....
NEEDED /home/test/lib/liba.so
NEEDED /home/test/lib/libb.so
NEEDED /home/test/lib/libc.so
....
Run Code Online (Sandbox Code Playgroud)