我遇到了一些包含以下内容的代码:
struct ABC {
unsigned long array[MAX];
} abc;
Run Code Online (Sandbox Code Playgroud)
何时使用这样的声明是有意义的?
我遇到了一段代码如下:
/* Allocate memory for _ptr */
if(*((void **) &(_ptr)) != (void *) NULL)
{
/* free _ptr */
}
Run Code Online (Sandbox Code Playgroud)
与以下有什么不同?
/* Allocate memory for _ptr */
if (_ptr != NULL )
{
/* free _ptr */
}
Run Code Online (Sandbox Code Playgroud)
编辑:_ptr可以是任何类型,实际上,这是一个宏如下:
#define RETURN_MEM_CHK(_ptr) \
{if(*((void **) &(_ptr)) != (void *) NULL){/* free _ptr */}
Run Code Online (Sandbox Code Playgroud)
抱歉引起混乱.
我有一些简单的代码,但我收到一个警告:
-bash-3.2$ gcc -Wall print_process_environ.c -o p_p
print_process_environ.c: In function 'print_process_environ':
print_process_environ.c:24: warning: implicit declaration of function 'strlen'
print_process_environ.c:24: warning: incompatible implicit declaration of built-in function 'strlen'
Run Code Online (Sandbox Code Playgroud)
以下是代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <strings.h>
void
print_process_environ(pid_t pid)
{
int fd;
char filename[24];
char environ[1024];
size_t length;
char *next_var;
snprintf(filename, sizeof(filename), "/proc/%d/environ", (int)pid);
printf("length of filename: %d\n", strlen(filename));
fd = open(filename, O_RDONLY);
......
Run Code Online (Sandbox Code Playgroud)
定义strlen()是:
#include <string.h>
size_t strlen(const char …Run Code Online (Sandbox Code Playgroud) 我正在研究用于嵌入式Linux上进程间通信的消息队列.我想知道为什么我没有使用Linux提供的消息队列如下:
msgctl,msgget msgrcv,msgsnd.
而不是创建共享内存,并与信号量同步?
直接在业务嵌入式产品上使用这组功能有什么缺点?
我有一个愚蠢的问题,但我被困住了.我在.vimrc文件中设置了set ts = 4,但看起来不行.打开一个新文件,选项卡仍然扩展为3个空格.在命令模式下,"set ts"得到一个"tabstop = 3".是否有像.vimrc这样的最终文件覆盖我的ts?
甚至我输入:set ts = 4,在vim中,当我输入tab时,它只有3个空格.
这是我的可疑选项,导致我的.vimrc中的这个恼人的结果
set autoindent
set shiftwidth=4
set softtabstop=4
set backspace=2
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有 3 个关于线程和进程通信的问题。
Linux 函数 msgget()、msgsnd() 和 msgrcv() 能否被一个进程中的多个线程调用?不同线程中的这些函数将尝试访问(读/写)一个进程的消息队列。系统是否应该考虑所有竞争条件?如果没有,是否有任何好的方法来支持线程并向其主线程(进程)发送消息?
semop()函数可以用来同步一个进程中的线程吗?
有一个共享内存,有以下实体可供访问。
很多问题。:) 谢谢。
源代码:
1 int func()
2 {
3 int a = 0x12345678;
4 int *p = &a;
5 return *p;
6 }
8 int main()
9 {
10 int b = 0x87654321;
11 return b + func();
12 }
Run Code Online (Sandbox Code Playgroud)
拆卸:
(gdb) disass main
Dump of assembler code for function main():
0x0000000000400544 <main()+0>: push %rbp
0x0000000000400545 <main()+1>: mov %rsp,%rbp
0x0000000000400548 <main()+4>: sub $0x10,%rsp
0x000000000040054c <main()+8>: movl $0x87654321,-0x4(%rbp)
0x0000000000400553 <main()+15>: callq 0x400528 <func()>
0x0000000000400558 <main()+20>: add -0x4(%rbp),%eax
0x000000000040055b <main()+23>: leaveq
0x000000000040055c <main()+24>: retq …Run Code Online (Sandbox Code Playgroud) 我看到一行代码如下:
xxxxx =(uint16_t)-1;
为什么将-1转换为unsigned int?这段代码是什么?
谢谢!
我在一个过程中有两个线程.这两个线程竞争共享内存,尝试通过信号量进行同步.但是当一个线程紧挨着另一个线程调用semop函数时,我随机地使用errno 4失败了.我做了一点挖掘,发现似乎呼叫被系统调用打断了.
EINTR在此系统调用中被阻止时,该过程发出信号; 见信号(7).errno 4是这个吗?
请注意第583和601行.
哪个系统调用打断了它?函数semop()本身?有什么方法可以忽略这个系统调用中断或恢复/重启这个功能?
semop可以在多线程环境中使用吗?
[Switching to Thread -1208269120 (LWP 4501)]
GetMyQue2Wait (MyModule=RM, wait_shm_ptr=0xbf8a5cf4) at tdm_ipc.c:247
247 TDM_SEM_P( MyModule );
(gdb) s
tdm_sem_p (mid=RM) at tdm_ipc.c:579
579 sem_b.sem_num = 0;
(gdb) s
580 sem_b.sem_op = -1;
(gdb) s
581 sem_b.sem_flg = SEM_UNDO;
(gdb) s
583 if (semop(TDM_M[mid].semid, &sem_b, 1) == -1)
(gdb) s
[Switching to Thread -1208480880 (LWP 4506)]
GetMyQue2Send (MyModule=RM, send_shm_ptr=0xb7f7ff54) at tdm_ipc.c:180
180 DMINT TryTimes = SEND_TIMES;
(gdb) s
353 TDM_SEM_V( DstModule );
(gdb) s …Run Code Online (Sandbox Code Playgroud) 我可以定义一个像:
#define ERROR_REPORT(LEVEL,SUB_LEVEL printf(
Run Code Online (Sandbox Code Playgroud)
编译器抱怨此行期待a ;.有没有办法逃脱"("?
这是为了取代一个功能:
ERROR_REPORT(LEVEL,SUB_LEVEL
"error, there is an error %d\n",
error_id);
Run Code Online (Sandbox Code Playgroud)
具有C内置功能
printf("error, there is an error %d\n",
error_id);
Run Code Online (Sandbox Code Playgroud)
编辑:我只想替换一个"(",不包括")".我之所以这么说的原因是已经有一些代码已经发布了问题,所以我只想替换一行像ERROR_REPROT(...与printf(.