小编dom*_*son的帖子

为什么popen()调用shell来执行进程?

我正在阅读并尝试在Linux上使用C代码运行程序的不同可能性.我的用例涵盖了所有可能的场景,从简单的运行和忘记过程,阅读写入过程,到阅读写入过程.

对于前三个,popen()非常容易使用并且运行良好.据我所知,它使用的一些版本fork()exec()内部,然后调用一个shell实际运行命令.

对于第三种情况,popen()不是一种选择,因为它是单向的.可用选项包括:

  • 手动fork()exec(),再加上pipe()dup2()输入/输出
  • posix_spawn(),根据需要在内部使用上述内容

我注意到的是,这些可以达到相同的效果popen(),但我们可以完全避免调用其他内容sh.这听起来很可取,因为它似乎不那么复杂.

但是,我注意到,即使我在Internet posix_spawn()找到的示例也会调用shell,因此看起来必须有一个好处.如果它是关于解析命令行参数,wordexp()似乎做同样好的工作.

是什么 背后的原因 调用shell来运行所需进程而不是直接运行它的好处?


编辑:我意识到我的问题措辞没有准确地反映我的实际兴趣 - 我对通过而不是(历史)原因好处更加好奇,尽管两者显然是相关的,所以两种变化的答案都是一样的相关.sh

c linux popen sh

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

如何最好地处理C++对象初始化:空构造函数或指针?

我想知道对于必须具有相对较大范围/长寿命的对象,对象初始化和存储的最佳方法是什么.假设我们有一个GameEngine类需要初始化并保持Window对渲染的引用.整个程序的生命周期都需要引用,窗口至少需要知道它的尺寸.

在Java中,我会这样做:

// Declaration:
Window window;
// Initialization:
window = new Window(width, height);
Run Code Online (Sandbox Code Playgroud)

我理解在C++中,第一个已经调用了Window类的默认构造函数,因此是声明初始化.window = Window(width, height);因此,有一个将分配,扔掉已经存在的对象.

我能找到的第一个解决方案是使用指针:

// GameEngine.hpp
class GameEngine {
    Window *window;
};

// Somewhere in GameEngine.cpp:
window = new Window(width, height);
Run Code Online (Sandbox Code Playgroud)

但话说回来,我经常读到一个人应该尽可能地支持普通对象而不是指针,事实上,我立刻陷入了一堆乱七八糟的指针,所以我正在寻找另一种方式.

另一种解决方案似乎是设计你的对象以获得没有参数的构造函数,并在以后设置对象:

// GameEngine.hpp
class GameEngine {
    Window window;
};

// Somewhere in GameEngine.cpp
window.setWidth(width);
window.setHeight(height);
Run Code Online (Sandbox Code Playgroud)

这有效,但有一个严重的缺点:对象(至少在这种情况下)可能处于不一致状态,因为试图在没有设置宽度/高度的情况下显示窗口会导致错误或崩溃.它确实适用于某些对象,但对大多数情况它没有.

避免这种情况的一种方法是使用默认值.例如,Window类的构造函数可能如下所示:

Window::Window(int width = 800, int height = 600) {} …
Run Code Online (Sandbox Code Playgroud)

c++ pointers initialization declaration object

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

用DIV围绕变形元素

我想在DIV中旋转一个文本元素,然而,在文本旋转后,我的div会像空的一样折叠.是否有一个CSS技巧让我的DIV仍然围绕着我的内在元素?

这是我的代码的样子:

li {
  border: 1px solid black;
  list-style-type: none;
}

p {
  display: inline-block;
  transform-origin: right bottom;
  transform: rotate(270deg);
}
Run Code Online (Sandbox Code Playgroud)
<li>
  <div>
    <p>Some Text</p>
  </div>
</li>

<li>
  <div>
    <p>Some Text</p>
  </div>
</li>
Run Code Online (Sandbox Code Playgroud)

html css

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

如何检查输出流的缓冲区类型?

使用setvbuf(),我们可以将流的缓冲区类型更改FILE*为以下之一:

  • _IONBF(无缓冲)
  • _IOLBF(行缓冲)
  • _IOFBF(完全缓冲)

例如,为了设置stderr为行缓冲,我们可以执行以下操作:

setvbuf(stderr, NULL, _IOLBF, 0);
Run Code Online (Sandbox Code Playgroud)

还有一种方法可以找出给定输出流的当前缓冲区类型(使用文件描述符或 FILE 指针)?

c linux

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

将Java枚举与点语法(enum.value1.value2)结合起来?

我正在浏览一些现有的(和工作的)代码,并遇到了这样的一行:

if (someObject.getStatus() == SomeEnum.VALUE1.VALUE2) { ... }
Run Code Online (Sandbox Code Playgroud)

SomeEnum是一个简单的枚举,看起来像这样:

public enum SomeEnum {
    VALUE1,
    VALUE2,
    VALUE3,
    ...
}

private SomeEnum() {}
Run Code Online (Sandbox Code Playgroud)

现在,上面的比较做了什么?更确切地说,那里的两个枚举值的组合是什么?因为我认为这是完全错误的,所以我很惊讶没有看到任何警告或错误.但是,它编译并运行得很好.有人可以告诉我这会做什么吗?

java enums android

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

将字符串初始化为 {0, } 有什么作用?

我见过这样的代码:

char str[1024] = {0, };
Run Code Online (Sandbox Code Playgroud)

并怀疑它类似于这样做:

char str[1024];
str[0] = '\0';
Run Code Online (Sandbox Code Playgroud)

但我在上面找不到任何东西,所以我不确定。

这是什么(称为),它有什么作用?


免责声明:我知道之前可能有人问过并回答过这个问题,但搜索{0, }非常困难。如果你能指出重复,我很乐意删除这个问题。

c string initialization

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

如何使用 Three.js 修改 UV 坐标

我想在运行时修改 JSON 模型的展开(UV 坐标),以便在几何体表面移动纹理。我faceVertexUvsGeometry 类文档中找到了。它包含一个数组,这是正确的。该数组包含很多元素,我假设它们是每个顶点的 UV 坐标。示例代码:

var uvs = mesh.geometry.faceVertexUvs[0];
console.log(uvs.length);
Run Code Online (Sandbox Code Playgroud)

给我4232作为输出。到目前为止,一切都很好。现在我想更改uv值,但数组的 4000 多个元素都是字符串("1""4234")。我只找到了一些示例,展示了如何从头开始创建展开,在这种情况下,人们将 Vector2 数据推送到faceVertexUvs. 那么为什么我在那里看不到 Vector2 数据呢?

uv-mapping three.js

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

有没有理由使用Math.pow()与文字而不是结果本身?

我目前正在查看现有代码.编写现有公式的方法有很多种.我偶然发现了几十个代码实例Math.pow(10.0D, 3.0D),Math.pow(300.0D, 2.0D)也有类似的东西1.5D * 1000.0D.

现在,在我继续前进,用他们各自的结果替换所有这些(1000d,90000d,1500d对于上面的例子),我想弄清楚是否有什么好的理由来继续使用原始符号?

我想到的唯一一件事就是保持代码与建模公式的相似性.还有其他原因我看不到吗?

java formula

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

如何通过缓冲纹理将16位整数正确发送到GLSL着色器

我有3072个类型的值std::int16_t(16位整数),它对应于a GLshort.我想把它们发送到我的GLSL着色器.我读了Buffer Textures并试图实现这种方法.但是,一旦到达着色器,数据似乎不再完好无损.我还不确定,但看起来这些价值都是0最大值的.我究竟做错了什么?

我的初始化代码看起来像这样(禁止一些不相关的东西):

// 1: Get the data - array of GLshort:

GLshort tboData[3072];
for (size_t i = 0; i < 3072; ++i)
{
    // cdb.getSprite() returns std::int16_t
    tboData[i] = (GLshort) cbd.getSprite(i);
}

// 2: Make sure the Shader Program is being used:

sp->use(); // sp is a wrapper class for GL Shader Programs

// 3: Generate the GL_TEXTURE_BUFFER, bind it and send the data:

GLuint tbo;
glGenBuffers(1, &tbo);
glBindBuffer(GL_TEXTURE_BUFFER, tbo);
glBufferData(GL_TEXTURE_BUFFER, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl buffer glsl

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

标签 统计

c ×3

c++ ×2

initialization ×2

java ×2

linux ×2

android ×1

buffer ×1

css ×1

declaration ×1

enums ×1

formula ×1

glsl ×1

html ×1

object ×1

opengl ×1

pointers ×1

popen ×1

sh ×1

string ×1

three.js ×1

uv-mapping ×1