标签: c

我该如何处理SIGCHLD?

我需要SIGCHLD妥善处理.如何在现有代码中使用它.目前我不能等待孩子的过程,除非我用0而不是WNOHANG|WUNTRACED.

status = 0; 
pid_t child, endID;

if(amp == 1)
        signal( SIGCHLD, SIG_IGN ); 

child = fork(); 

if (child  <  0) {    
        perror("fork() error\n");
        exit(EXIT_FAILURE);

} else if (child == 0) { 
        // do sth here
        perror("error\n");

} else { 
        //sleep(1)
Run Code Online (Sandbox Code Playgroud)

如果我删除sleep然后父执行第一..为什么?

c sigchld

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

是否有C标准的着名"概况"?

我编写C代码,对实现做出某些假设,例如:

  • char 是8位.
  • 有符号整数类型是两个补码.
  • >> 有符号整数sign-extends.
  • 整数除法将负商指向零.
  • doubleIEEE-754是双倍的,可以通过uint64_t预期的结果进行打字和打字.
  • 涉及NaN的比较总是评估为假.
  • 空指针都是零位.
  • 所有数据指针都具有相同的表示形式,并且可以在size_t不丢失信息的情况下转换回来.
  • 指针算术on char*与普通算术相同size_t.
  • 函数指针可以在void*不丢失信息的情况下再次强制转换.

现在,所有这些都是C标准所不能保证的,所以严格来说我的代码是不可移植的.但是,它们在我目前正在瞄准的体系结构和ABI上都是正确的,经过仔细考虑之后,我已经确定他们未能在某些架构上保留的风险,我将来需要将其作为目标.与我现在做出假设所得到的实用好处相比.

问题是:我如何最好地记录这一决定?我的许多假设都是由几乎每个人(非八位字节char或符号幅度整数?未来,商业上成功的架构?)制定的.其他人更有争议 - 最危险的可能是关于函数指针的问题.但是,如果我只列出一切我认为超出标准给我,读者的眼睛只是要呆滞,他可能没有注意到,实际上很重要的人.

那么,是否有一些众所周知的关于成为"有点正统"的架构的假设,我可以通过引用合并,然后只明确记录我甚至超出的范围?(实际上这样的"概况"将定义一种新的语言,它是C的超集,但它可能不会承认这么多的话 - 而且它也可能不是一种实用的方法来考虑它).

澄清:我正在寻找一种记录我的选择的简写方式,而不是一种自动测试给定编译器是否符合我的期望的方法.后者显然也很有用,但并不能解决所有问题.例如,如果业务合作伙伴联系我们说:"我们正在制作基于Google新G2015芯片的设备;您的软件会在其上运行吗?" - 那么能够回答"我们还没有使用过那个拱门,但如果它有一个满足这样的C编译器就不应该是一个问题".

澄清甚至更多,因为有人投票决定关闭"不具有建设性":我不是在这里寻求讨论,只是为了指向实际的,现有的,正式的文件,可以通过引用并入我的文档.

c language-lawyer

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

使用doxygen来记录结构定义之外的ac结构的成员

我正在使用doxygen来评论我的C代码.我正在使用外部API(即不是我自己的),文档很少,所以我打算在我自己的源文件中记录一些API.我确实有外部API的头文件,但将我自己的注释添加到该文件是不切实际的.

外国标题

struct foreignstruct
{
    int a;
    int b;
};
Run Code Online (Sandbox Code Playgroud)

我的标题

/** My structure comments...
struct mystruct
{
    /** Describe field here... */
    int field;
};

/** @struct foreignstruct
 *  @brief This structure blah blah blah...
 *  @??? a Member 'a' contains...
 *  @??? b Member 'b' contains...
 */
Run Code Online (Sandbox Code Playgroud)

我在的地方用什么标签@???,以获得正确的doxygen输出(其中"正确"的方法产生输出,mystruct并且foreignstruct是相同的)?

c doxygen

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

NEON vs Intel SSE - 某些操作的等效性

我在查明几个英特尔SSE操作的NEON等效性时遇到了一些麻烦.看起来NEON不能同时处理整个Q寄存器(128位值数据类型).我没有在arm_neon.h头文件或NEON内在函数参考中找到任何内容.

我想做的是以下内容:

// Intel SSE
// shift the entire 128 bit value with 2 bytes to the right; this is done 
// without sign extension by shifting in zeros
__m128i val = _mm_srli_si128(vector_of_8_s16, 2);
// insert the least significant 16 bits of "some_16_bit_val"
// the whole thing in this case, into the selected 16 bit 
// integer of vector "val"(the 16 bit element with index 7 in this case)
val = _mm_insert_epi16(val, some_16_bit_val, 7);
Run Code Online (Sandbox Code Playgroud)

我已经看过NEON提供的转换操作,但找不到相同的方法来做上述事情(我对NEON没有多少经验).是否有可能做到以上(我想这是我只是不知道如何)?任何指针都非常感激.

c c++ sse simd neon

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

将源代码翻译成外语

我正在运行一个教育网站,教孩子们(12-15岁).

因为他们并不都在解决方案的代码源中说英语,所以我们使用法语变量和函数名称.但是,我们计划将内容翻译成其他语言(德语,西班牙语,英语).为此,我想尽快翻译源代码.我们大多数都有C/C++代码.

我打算使用的解决方案:

  1. 从源代码中提取所有变量/函数名称,以及它们在文件中的位置(声明,使用,调用它们的位置......)
  2. 删除所有语言关键字和库函数
  3. 请翻译人员提供其余名称的翻译
  4. 替换文件中的名称

是否已经有一些开源代码/项目可以做到这一点?(对于第1,2和4点)

如果没有,那么第一个中最困难的一点是:使用C/C++解析器构建一个语法树然后用它们的位置提取变量似乎是要走的路.你有其他想法吗?

谢谢你的任何建议.

编辑: 如评论中所述,我还需要处理注释,但只有少数几个:完整的解决方案已经用纯文本解释,然后我们用自解释的变量显示代码源/函数名称.源代码很少超过30/40行,如果您已经知道代码在做什么,那么好的名称必须使它在没有注释的情况下可以理解.

附加信息:对于感兴趣的人来说,网站是国际奥林匹克信息学和C/C++的培训平台(至少是编程竞赛所需的最低限度),12岁时学习并不困难.

c c++ localization

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

C中两个变量(如+++ b)之间的3个加号

#include <stdio.h>

int main()
{
    int a=8,b=9,c;
    c=a+++b;
    printf("%d%d%d\n",a,b,c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的程序输出a=9 b=9c=17.在a+++b为什么编译器会a++,然后用增加b.为什么不考虑a +++b?是否有特定的名称a+++b.请帮我理解.

c syntax

12
推荐指数
2
解决办法
664
查看次数

结构与未知大小的结构数组

我一整天都试图绕过这个......

基本上,我有一个名为State的结构,它有一个名称,另一个名为StateMachine,带有名称,状态数组和添加的状态总数:

#include <stdio.h>
#include <stdlib.h>

typedef struct State {
  const char * name;

} State;

typedef struct StateMachine {
  const char * name;

  int total_states;
  State ** states;

} StateMachine;

StateMachine * create_state_machine(const char* name) {
  StateMachine * temp;

  temp = malloc(sizeof(struct StateMachine));

  if (temp == NULL) {
    exit(127);
  }

  temp->name = name;
  temp->total_states = 0;

  temp->states = malloc(sizeof(struct State));
  return temp;
}

void destroy_state_machine(StateMachine* state_machine) {
  free(state_machine);
}

State * add_state(StateMachine* state_machine, const char* name) {
  State * …
Run Code Online (Sandbox Code Playgroud)

c arrays struct

12
推荐指数
2
解决办法
2万
查看次数

按位运算符从32位获取字节

我有兴趣编写一个getMyByteChunkFunction接受两个参数的函数- 一个32位整数和一个字节偏移量(0,1,2或3),然后从32位整数中返回相应的字节.例如,给定此整数:

            (3)         (2)      (1)      (0)   ---byte numbers
int word = 10101010 00001001 11001010 00000101
Run Code Online (Sandbox Code Playgroud)

函数调用getMeByteChunkFunction(word, 2)返回00001001.

但是,我可以使用的按位运算符有限.我只允许使用>>,<<以及只有一个减法.我知道如何使用AND和XOR来做到这一点,但我不知道我在这里如何使用减法.有任何想法吗?

c c++ algorithm bit-manipulation

12
推荐指数
2
解决办法
7891
查看次数

如何在C/C++中使用lame将mp3解码为wav?

我学习了如何使用lame_encode_buffer_interleaved这个问题将wav编码为mp3 :是否有任何LAME c ++ wraper\simplifier(在Linux Mac上工作,从纯代码中获胜)?

现在我想将mp3解码回wav.我知道有,lame_decode但我不知道如何使用它,因为它需要两个pcm缓冲区(pcm_lpcm_r).我不明白如何将它们组合成一个格式良好的wav文件,因为我真的不知道它们是如何工作的.

现在有人可以提供一个简单的工作示例,使用C/C++中的lame将mp3解码为wav吗?

谢谢.

c c++ lame

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

C函数是否保证具有固定的内存地址?

如果我存储指向函数的指针,然后在程序执行期间的某个稍后点,将它与同一函数的地址进行比较,两个地址是否保证相等.

例如

int foo(void){return 0;}
int (*foo_p)(void) = &foo;

assert(foo_p == &foo);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,断言始终保证成功吗?是否有任何情况下函数的地址可以改变?

c pointers function-pointers

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