小编Sun*_*lly的帖子

size_t的最大大小

我知道C返回类型的sizeof运算符是size_t在中定义的无符号整数类型<stdint.h>.这意味着它的最大尺寸应该65535在规定作为C99标准7.18.3:

limit of size_t
  SIZE_MAX             65535
Run Code Online (Sandbox Code Playgroud)

但是在gcc-4.8.2头文件stdint.h中定义的大小远远大于标准中所述的与下面所示的65535相矛盾的大小C99,

/* Limit of `size_t' type.  */
# if __WORDSIZE == 64
#  define SIZE_MAX              (18446744073709551615UL)
# else
#  define SIZE_MAX              (4294967295U)
# endif
Run Code Online (Sandbox Code Playgroud)

请帮助我理解为什么在我的误解背后存在差异或原因.

c gcc sizeof c99 size-t

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

理解求和逻辑

这是在不使用运算符的情况下执行加法的求和逻辑,+如下所示,

int add(int a, int b) {
   const char *c=0;
   return &(&c[a])[b];
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以让我理解如何return声明如何添加a&b.

c

7
推荐指数
2
解决办法
483
查看次数

使用Linux功能是否会禁用LD_PRELOAD

在我的自定义环境拦截库预装它运行一个特殊的实施bind(),connect()等电话.

我看到的问题是,无论何时使用命令显式启用应用程序setcap,执行应用程序都无法预加载拦截器库并调用默认的libc connect().

这是预期的行为吗?如果是,可能是什么原因禁用LD_PRELOAD

是否有任何调整或方法可用于成功预加载启用功能的库.

c linux shared-libraries linux-kernel linux-capabilities

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

中断处理程序使用哪个堆栈 - Linux

在多任务系统中,当任何硬件产生对特定CPU的中断时,CPU可以执行以下任一情况,除非它已经在服务ISR:

  1. 用户模式进程正在CPU上执行
  2. 内核模式进程正在CPU上执行

想了解上述两种情况下中断处理程序使用哪个堆栈,为什么?

linux stack linux-kernel interrupt-handling top-halves

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

更改用户ID以分配其他功能

我的自定义程序使用非root权限执行,用户ID为:uid: 1000 euid: 0在fork()之后,在子进程execv()中调用以运行SSH客户端服务.由于我在非特权用户下启动程序,当尝试将套接字绑定到设备时,Linux内核执行所有权限检查,导致子程序sock_setbindtodevice()在检查CAP_NET_RAW功能时出现故障,如下所示.

我正在考虑的解决方案是首先获得子进程中的root权限,执行特权操作,例如设置所需的功能,然后回退到非root用户.

这里的一个问题是,下拉到非root用户需要什么,因为当执行ssh命令时,我希望生成的DSA/RSA密钥存储在$HOME/.ssh/known_hosts而不是root/.ssh/known_hosts.

请在下面找到以下代码段:

void
global_exec_func (const char *proc_name, const char *proc_path, char **arg_list)
{
    pid_t   pid;
    int     status, euid;

    struct __user_cap_header_struct cap_header_data;
    cap_user_header_t cap_header = &cap_header_data;
    struct __user_cap_data_struct cap_data_data;
    cap_user_data_t cap_data = &cap_data_data;

    pid = fork();
    if (pid < 0) {
       printf("%% can't fork process %s", proc_name);
       return;
    }   

    /*  
     * Child process.
     */
    if (pid == 0) {
         euid = geteuid();          /* Storing …
Run Code Online (Sandbox Code Playgroud)

c linux ssh linux-capabilities

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

'for'循环初始声明中的静态变量

想知道为什么我不能在for循环初始化中声明一个静态变量,如下所示,

for(static int i = 0;;)
Run Code Online (Sandbox Code Playgroud)

用我的C99标准编译器编译上面的循环语句代码我看到下面的错误,

error: declaration of static variable ‘i’ in ‘for’ loop initial declaration
Run Code Online (Sandbox Code Playgroud)

c static c99

4
推荐指数
2
解决办法
4640
查看次数

exec()之后的RUID和EUID

使用fork()操作子进程从父进程继承属性真实有效的用户ID,exec()执行时它的行为如何?

linux fork exec

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

我可以直接将地址分配给指针吗?如果是这样,该怎么做?

int main()
{
  int a = 2; // address is 0x7ffeefbff58c
  int *b = &a;
  std::cout << "address of a: " << b << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在地址0x7ffeefbff58c中有我的int变量a,但是我可以直接为int * b分配0x7ffeefbff58c吗?

我尝试了int * b = 0x7ffeefbff58c; 但是有一个错误提示“无法用'long'类型的右值初始化'int *'类型的变量”,所以我必须使用(&a)的地址来初始化指针吗?还是有其他方法可以做到?

c++ pointers

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