小编Joe*_*e.Z的帖子

为什么声明一个只包含C中数组的结构?

我遇到了一些包含以下内容的代码:

struct ABC {
    unsigned long array[MAX];
} abc;
Run Code Online (Sandbox Code Playgroud)

何时使用这样的声明是有意义的?

c arrays struct coding-style

129
推荐指数
5
解决办法
6988
查看次数

什么"if(*((void**)&(_ ptr))!=(void*)NULL)"检查?

我遇到了一段代码如下:

/* 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)

抱歉引起混乱.

c pointers casting

25
推荐指数
3
解决办法
1313
查看次数

接收警告"隐含声明功能'strlen'"

我有一些简单的代码,但我收到一个警告:

-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)

c posix

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

Linux的消息队列有哪些缺点?

我正在研究用于嵌入式Linux上进程间通信的消息队列.我想知道为什么我没有使用Linux提供的消息队列如下:

msgctl,msgget msgrcv,msgsnd.

而不是创建共享内存,并与信号量同步?

直接在业务嵌入式产品上使用这组功能有什么缺点?

c linux message-queue sysv-ipc

13
推荐指数
2
解决办法
9131
查看次数

为什么不在.vimrc中设置ts = 4?

我有一个愚蠢的问题,但我被困住了.我在.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)

谢谢.

vim

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

消息队列支持多线程吗?

我有 3 个关于线程和进程通信的问题。

  1. Linux 函数 msgget()、msgsnd() 和 msgrcv() 能否被一个进程中的多个线程调用?不同线程中的这些函数将尝试访问(读/写)一个进程的消息队列。系统是否应该考虑所有竞争条件?如果没有,是否有任何好的方法来支持线程并向其主线程(进程)发送消息?

  2. semop()函数可以用来同步一个进程中的线程吗?

  3. 有一个共享内存,有以下实体可供访问。

    • 过程
    • 一个进程中的多个线程。我是否必须同时使用进程间级别的信号量和线程级别的信号量?有什么简单的方法可以处理这个问题吗?

很多问题。:) 谢谢。

c linux

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

如何抵消堆叠?

源代码:

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)

c linux assembly disassembly

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

为什么这样投?"(uint16_t)-1;"

我看到一行代码如下:

xxxxx =(uint16_t)-1;

为什么将-1转换为unsigned int?这段代码是什么?

谢谢!

c

3
推荐指数
2
解决办法
986
查看次数

semop()失败了errno 4.剂量semop()支持线程在进程内的竞争?

我在一个过程中有两个线程.这两个线程竞争共享内存,尝试通过信号量进行同步.但是当一个线程紧挨着另一个线程调用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)

c linux semaphore

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

是否可以定义一个"('被转义?

我可以定义一个像:

#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(.

c

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