C中fork函数问题记录-fork输出结果不一致
在测试fork特性的时候,用命令行运行与ide中出现完全不同的效果。单独测试fork函数的时候发现,fork成功,但是它会从main函数开始运行。特此记录!
环境
华为云centos7
编程ide:vscode+remote
编译环境:gcc version 4.8.5 20150623 (Red Hat 4.8.5-44)
代码与结果123456789101112131415161718#include <unistd.h> #include <stdio.h> int main(void) { int i=0; printf("i son/pa ppid pid fpid\n"); /id指当前进程的父进程pid //pid指当前进程的pid, //fpid指fork返回给当前进程的值 for(i=0;i<2;i++){ pid_t fpid=fork(); if(fpid==0) printf(&q ...
C语言中__attribute__的用法
@TODO 后续添加
引用C语言中__attribute__的用法
C 语言中的字节对齐
TODO
C语言关键字学习
主要是熟悉 C 语言中的有关除了基础语法的外的关键字,并讲解一般的使用场景!
关键字语义
关键字名
语义
#define
定义一个预处理宏
#undef
取消宏的宏
#if
编译预处理中的条件命令,相当于 C 语法中的 if 语句
#ifdef
判断某个宏是否为定义,若已定义,执行随后的语句
#ifndef
与#ifdef相反,判断某个宏是否未被定义
#elif
若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的 else-if
#else
与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif
#if, #ifdef, #ifndef这些条件命令的结束标志.
defined
与#if, #elif配合使用,判断某个宏是否被定义
#ifndef的用法#ifndef的语义是判断某个宏是否未被定义。起到的效果是防止一个源文件两次包含同一个头文件,而不是防止两个源文件包含同一个头文件。
使用场景:
在 ...
C 语言变量与参数平台差异
本文主要讲解本人在开发过程中遇到的一些不同平台的差异的问题,已经使用的注意事项
BUFSIZ此参数定义在stdio.h中,在 win 中有 512 个字节,在 linux 中有 8192 个字节。
Win 12/* Buffered I/O macros */#define BUFSIZ 512
Linux 12345678910// stdio.h#ifndef BUFSIZ# define BUFSIZ _IO_BUFSIZ#endif// libio.h#define _IO_BUFSIZ _G_BUFSIZ// _G_config.h#define _G_BUFSIZ 8192
__VA_ARGS__
__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有 gcc 支持。
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。
Linux 123456789#include<stdio.h>#define print_variable(...) printf(__VA_ARG ...
C语言面试题简单理解
局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用”::” ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
注意:根据测试,这里说的应该是命名空间概念。而 C 语言是没有命名空间的。
关于断言的使用
断言主要用于检测传入参数是否合法。如果参数不合法则会报错并退出程序,因而只能用于测试开发阶段。
原则断言的使用和参数的检测一样,在保证合理运行的基础上,参数的限制越少越好。
使用场景FIXME 中使用 在使用 FIXME 的地方检测你需要关注的参数,如果没有要验证的参数,则可以不写。
示例代码摘抄自ffmpeg4.2.2的 libavcodec/encode.c 中的ff_alloc_packet2():
12345678if (avctx && 2*min_size < size) { // FIXME The factor needs to be finetuned av_assert0(!avpkt->data || avpkt->data != avctx->internal->byte_buffer); if (!avpkt->data || avpkt->size < size) { av_fast_padded_malloc(&a ...
位运算的奇淫巧技
由于本人在阅读 FFmpeg 的源代码过程中,发现有很多的位运算相关内容。但是,由于本人半路出家对于这些基础知识不扎实且不成体系,因而在此记录本人遇到的和百度发现的。下方会附上原文链接。
位运算实现四则运算
乘除法:这个相对简单,就是简单的左移右移
123int a = 2;a >> 1; ---> 1a << 1; ---> 4
加减法:此方法在某些特殊值域范围内有效,目前阅读 FFmpeg 代码发现 8192 与其它值能有效保证此结构。请注意自己区分。
123int a = 1, b = 2, c = -1;a | b; ---> 3a | c; ---> 0
位运算交换两数123a ^= b;b ^= a;a ^= b;
位运算判断奇偶只要根据数的最后一位是 0 还是 1 来决定即可,为 0 就是偶数,为 1 就是奇数
123if(0 == (a & 1)) { //偶数}
位操作求绝对值整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位(整数右移 3 ...
C语言的线程pthread
讲解 Linux 系统中的线程的使用
本文主要用于记录所学所用!
背景知识 Linux 没有真正意义上的线程,它的实现是由进程来模拟,所以属于用户级线程,位于 libpthread 共享库(所以线程的 ID 只在库中有效),遵循 POSIX 标准。
历史上,Linux 有三种线程实现。分别是 LinuxThreads,NGPT(Next Generation POSIX Threads),NPTL(Native POSIX Threads Library)。
LinuxThreads:受限于内核特性,违背了 SUSV3 Pthreads标准。
NGPT: 由 ibm 开发,曾被作为 LinuxThreads 的继任者。
NPTL: 由于性能由于 NGPT, 因而目前使用的就是 NPTL。
有关 Linux 线程进一步介绍请看Linux历史上线程的3种实现模型
Windows 下有一个真正的数据结构 TCB 来描述线程。
进程与线程的区别
进程:程序的一个动态运行实例,承担分配系统资源的实例。( Linux 实现进程的主要目的是资源独占)
线程:在进程的内部运行(进程的地 ...
C 语言中的字符串处理
本文主要讲解在 Linux平台下 string.h 库中的字符串处理函数以及其中额外带的内存操作函数。
任何语言中涉及的常规操作其中使用频率从上到下依次减小
计算字符串的长度:strlen()
比较字符串是否相等:strcmp()、strncmp()
查询一个字符在字符串中的索引位置:由于有指针的原因,直接返回对应字符位置的指针,更容易操作
分割字符串:采用偏移数组起始位置与strncpy()或memcpy()实现
查找某个字符串在字符串中出现的位置:strstr()
字符串全部变为大写或小写:
查询字符串中是否存在某个字符:strchr()、strnchr()
字符串处理函数为了提高程序在不同机器上的移植性,利用 typedef 定义新类型名,即typedef unsigned int size_t。
在 Linux 系统中 string.h 的库函数关于字符串处理的有以下函数内容。
函数
说明
char *strcat(char *restrict, const char *restrict);
把最后一个参数连接到第二个参数的后面
char *strchr( ...