小编P.P*_*.P.的帖子

C中的重入和重入?

我正在读一本名为Linux System Programming的书.引用本书:

那么系统调用和其他库函数呢?如果您的进程正在写入文件或分配内存,并且信号处理程序写入同一文件或调用malloc(),该怎么办?有些功能显然不可重入.如果一个程序正在执行一个非重入函数并且信号发生并且信号处理程序然后调用相同的非重合函数,则可能发生混乱.

但接下来会:

保证重入函数

保证可以安全重入的功能用于信号

一些功能在这里..

写()

一些功能在这里..

我很困惑,是可以write()折返的,还是没有?因为我认为它与声明冲突:

如果您的进程正在写入文件,该怎么办?

c concurrency reentrancy

6
推荐指数
2
解决办法
907
查看次数

从QTreeWidget再次获取QTreeWidgetItem列表

我怎么做?实际上我的主要目标是确定选中哪个复选框QTreeWidget.但是,如果你们帮我解决这个问题,我可以这样做.好吧,我找不到一个方法再给我一个QList<QTreeWidgetItem *>所以我可以遍布整个列表并检查复选框是否被选中(奇怪的句子,嗯?). QTreeWidget::selectedItems()不做我想做的事.它实际上得到了所选的项目(可能只有一个.所以我不知道itemS在这里意味着什么.无论如何我可能是错的).

我现在的主要目标是:通过QTreeWidget它可以做任何我想做的事情.

提前致谢.

c++ checkbox qt qtreewidget

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

将值从子级传递到父级进程

我有应该创建三个子进程的代码,每个代码都将执行一个小的数学运算。然后,父级应该使用所有子进程的结果并获得最终答案,但我找不到在父级中实际读取子级结果的方法。有没有办法做到这一点?

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

int main(void)
{
   int pid1, pid2, pid3, status;
   int a=1, b=2, c=5, d=4, e=6, f=3, g;
   int t1, t2, t3;

   printf("Hello World!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
   printf("Here I am  before use of forking\n");
   printf("I am the PARENT process and pid is : %d\n",getpid());

   pid1 = fork( );
   if (pid1 == 0)
   {      
    printf("\n\nHere I am just after child forking1\n");
    printf("I am the Child process and pid1 is :%d\n",getpid());      
    printf("My parent's pid is :%d\n",getppid());   
    t1 = a+b;
    printf("The …
Run Code Online (Sandbox Code Playgroud)

c linux fork parent-child

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

C编程Char可能的值

我正在努力学习C,现在我正在学习字符.我已经读过一些字符可以签名和未签名的地方.这部分我得到但是当我使用unsigned char(我认为它可以保持0-255的值)

printf("%c", 400); 
Run Code Online (Sandbox Code Playgroud)

甚至

printf("%c\n", (unsigned char)400);
Run Code Online (Sandbox Code Playgroud)

它打印出一个 É

为什么是这样?

c char

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

使用new创建一个结构数组

我有一些困难的情况,我希望有些机构会帮助我.

我有以下,

struct CandyBar{ 
  std::string name; 
  double weight; 
  int calories; 
} ;
Run Code Online (Sandbox Code Playgroud)

现在,为了创建一个包含许多CandyBars的结构数组,我做的很简单;

int main(){
   CandyBar bars[] = {{"Mango tart", 2.3, 100}, {"Yo Yo", 3.2, 130}, {"Orange Ball", 1.7, 98}};
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,现在我想用new创建相同的结构.我认为这很简单,但这会崩溃并且不起作用.

CandyBar *bars = new CandyBar;
  (*bars).name = "Mango tart";
   bars->weight =  2.3;
   bars->calories =  100;
   bars += 1;

  (*bars).name = "Yo Yo";
  bars->weight =  3.2;
  bars->calories =  130;

  bars += 1;
  (*bars).name =  "Orange Ball";
  bars->weight =  1.7;
  bars->calories =  98; 
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.因为我认为第一个指针是指向第一个结构的内存位置,然后我创建结构,然后使用bar + = 1增加地址,继续创建指针,但我错过了一些非常严重的东西.

我将衷心感谢您的帮助.

c++ struct data-structures

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

sizeof()在C(GCC)中的行为

在回答关于sizeof()的问题时,为了看看GCC如何处理,我编写了以下代码:

#include<stdio.h>
#include<stddef.h>
#include<limits.h>

int main(int ac, char *argv[])
{
    printf("%zu\n", sizeof(9999999999999999999999999999999999999999999999999999) );
    printf("%zu %zu \n", sizeof(int), sizeof(long long));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编制时,海湾合作委员会(4.1.2)发出警告(如预期):

t.c:8:24: warning: integer constant is too large for its type
t.c: In function main:
t.c:8: warning: integer constant is too large for long type
Run Code Online (Sandbox Code Playgroud)

输出是:

16
4 8
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会怎么说这sizeof(9999999999999999999999999999999999999999999999999999)是16?无论多大numnber,对于任何大于的整数文字,它总是16 LLONG_MAX.在我的64位平台sizeof(long)上等于sizeof(long long).

为什么海湾合作委员会这样做?这是某种未定义的行为吗?!

c gcc sizeof

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

shebang 标志与设置内置标志之间的区别

在 shebang 行上传递给脚本的标志与使用set内置函数的行为是否存在差异?

例如:

#!/bin/bash -e

# do stuff
Run Code Online (Sandbox Code Playgroud)

对比

#!/bin/bash
set -e
# do stuff
Run Code Online (Sandbox Code Playgroud)

(问题不是特定于-e标志,而是针对任何此类标志的一般问题)。

显然,set [flags]只有从它设置的点开始才有效。但是在功能/行为方面还有其他区别吗?

POSIX shell 中的行为也一样吗?

bash posix sh

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

为什么C没有为数组定义最小大小?

C标准定义了许多下限/上限(转换限制),并强制实现应满足每个转换.为什么没有为数组大小定义这样的最小限制?以下程序将编译正常并可能产生运行时错误/段错误,并将调用未定义的行为.

int main()
{
   int a[99999999];
   int i;

   for(i=0;i<99999999;i++)
   a[i]=i;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

可能的原因可能是在自动存储上分配了本地数组,它取决于分配的堆栈帧的大小.但为什么不像C定义的其他限制那样达到最小限度?

让我们忘记上面提到的未定义的情况.考虑以下:

int main()
{
   int a[10];
   int i;

   for(i=0;i<10;i++)
   a[i]=i;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面,是什么让我保证本地数组(尽管非常小)将按预期工作,并且不会因分配失败而导致未定义的行为?

虽然这种小型阵列的分配不太可能在任何现代系统上失败.但是C标准没有定义满足要求,编译器也没有(至少GCC没有)报告分配失败.只有运行时错误/未定义的行为才有可能.困难的部分是没有人能够判断任意大小的数组是否会因分配失败而导致未定义的行为.

请注意,我知道我可以使用动态数组(通过malloc和朋友)来实现此目的,并可以更好地控制分配失败.我更感兴趣的是为什么没有为本地数组定义这样的限制.此外,全局数组将存储在静态存储中,并将增加编译器可以处理的可执行文件大小.

c arrays undefined-behavior

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

bash脚本无法读取第一行

我有一个脚本将时间戳转换为秒,所以我最终可以计算平均值.我注意到输出行的数量不等于输入行的数量.实际上它似乎没有阅读第一行.我简化了代码来检查它,但每次都是一样的.

输入文件如下所示:

00:00:01
00:00:02
00:00:03
Run Code Online (Sandbox Code Playgroud)

输出如下:

00 00 02
00 00 03
Run Code Online (Sandbox Code Playgroud)

这是脚本:

#!/bin/bash

while read line
do
    awk -F: '{ print $1, $2, $3 }' > /home/time.log

done < /home/timestamp.log
Run Code Online (Sandbox Code Playgroud)

我确定这是愚蠢的,但我看不到它!

bash awk

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

O_DIRECT 未声明、Eclipse CDT、Ubuntu 20.04

我遇到 O_DIRECT 问题。我尝试将它与 一起使用open(),但出现如下错误:

error: O_DIRECT undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

我包括<fcntl.h>

我搜索了/usr/include/目录O_DIRECT,它存在于x86_64-linux-gnu/bits/fcntl-linux.h. 我尝试包含此文件,但随后出现此错误:

error: #error Never use <x86_64-linux-gnu/bits/fcntl-linux.h> directly; include <fcntl.h> instead.
Run Code Online (Sandbox Code Playgroud)

我正在新安装的 Ubuntu 20.04 系统上的 Eclipse CDT 项目中尝试所有这些。

c linux ubuntu eclipse-cdt

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