小编Dod*_*ddy的帖子

Linux中进程和线程之间的区别

在阅读了这篇回答和Robert Love的"Linux内核开发"之后,随后,在clone()系统调用中,我发现Linux中的进程和线程(几乎)与内核无法区分.他们之间有一些调整(在引用的SO问题中被讨论为"更多共享"或"更少共享"),但我仍然有一些问题尚未得到解答.

我最近参与了一个涉及几个POSIX线程的程序,并决定在这个前提下进行实验.在创建两个线程的进程中,所有线程当然都会获得一个返回的唯一值pthread_self(),不是getpid().

我创建的示例程序如下:

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

void* threadMethod(void* arg)
{
    int intArg = (int) *((int*) arg);

    int32_t pid = getpid();
    uint64_t pti = pthread_self();

    printf("[Thread %d] getpid() = %d\n", intArg, pid);
    printf("[Thread %d] pthread_self() = %lu\n", intArg, pti);
}

int main()
{
    pthread_t threads[2];

    int thread1 = 1;

    if ((pthread_create(&threads[0], NULL, threadMethod, (void*) &thread1))
         != 0)
    {
        fprintf(stderr, "pthread_create: error\n");
        exit(EXIT_FAILURE);
    } …
Run Code Online (Sandbox Code Playgroud)

c linux multithreading

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

了解OpenGL

我有一些关于OpenGL的基本观点/问题,不是所有涉及代码而是概念.如果你能回答,肯定或扩展他们中的任何一个,我将不胜感激.我警告你,有些人可能天真,所以请耐心等待.

  1. 我知道OpenGL只是一个标准,而不是一个软件.例如,"获取"OpenGL实际上涉及获得第三方实现,而不一定必须得到Khronos的认可.

  2. OpenGL通常指GL实用程序(GLU)和GL实用工具包(GLUT)的组合.他们的方法以gluand 开头glut.而简单的"基本"OpenGL方法gl是由那些制作图形驱动程序的人实现的,即NVIDIA?

  3. 我假设这些glut方法是特定于操作系统的助手,例如glutKeyboardFunc()必须要解释键盘.因此,如果我想要一种更强大的替代方式来解释键盘输入,我只会使用OS API.OpenGL本身纯粹是关于图形,但glut有这种东西,因为图形并没有太多没有实时的人为控制.

  4. 在我看来,glu方法可能与调用一系列低级gl方法相同.我想引用的一个例子是glOrtho()gluPerspective().在我看来,他们有类似的工作方式,但计算透视可能更复杂,所以gluPerspective()是为了方便,但可能只是解决某些gl方法.

  5. 我在大学时使用freeglut研究了基本的OpenGL,并且我一直只使用低级方法来实现使用OpenGL的"硬核"方式.我不知道这是否是一个完全天真的想法,但是有一种"专业"的方式来编写OpenGL,以获得它的最大功能吗?比如,据推测,游戏开发者不会使用glutPostRedisplay(),例如,对吧?这似乎太容易和方便,就像它隐藏了很多正在发生的事情.我怀疑对于C++也是如此,因为GLUT回调对命名空间中的方法不友好(正如我在其他问题中看到的那样).

c c++ opengl

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

access()有什么问题?

可能重复:
access()安全漏洞

我引用man page access(2):

警告:使用access()来检查用户是否有权在例如打开文件之前使用open(2)创建安全漏洞,因为用户可能利用检查和打开文件之间的短时间间隔操纵它.因此,应避免使用此系统调用.

这是什么意思,在什么情况下会引起关注?

c linux system-calls

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

检查正在运行的程序中的内存泄漏

我有一个问题是出于对检查内存泄漏的好奇心.

作为一个valgrind经常用于检查我的代码在过去一两年中是否存在内存泄漏的人,我突然想到它只能在程序生命周期之后检测丢失/不一致的内存.

所以,考虑到这一点,我想如果你有一个长期运行的程序malloc()是间歇性的,free()直到应用程序退出,那么吃内存的可能性(不一定是通过泄漏)是巨大的,而不是使用这些工具可观察,因为它们只在程序生命周期后检查.是否有类似GDB的工具可以在运行时停止应用程序并检查应用程序生命周期某个实例是否存在的内存?

c linux debugging memory-leaks

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

在Java中执行URI命令

Steam允许用户启动游戏并执行许多其他操作的一种方法是使用URI协议(例如来自Valve开发人员社区):

steam://run/<id> 将启动与指定ID对应的游戏.

steam://validate/<id> 将验证指定ID的游戏文件.

如何让Java"运行"这些?我甚至不知道你叫什么,即你'运行'URI,或'执行'它们,或者什么?因为可能这些URI没有任何东西可以返回,并且URIJava中的类没有任何与"执行"它们相关的东西URL,但是它确实没有,但它不起作用!

我试过这个:

...
try
{
    URI testURI = URI.create("steam://run/240");
    URL testURL = joinURI.toURL();
    // URL testURL = new URL("steam://run/240") doesn't work either
    joinURL.openConnection(); // Doesn't work
    // joinURL.openStream() doesn't work either
}
catch (MalformedURLException e)
{
    System.err.println(e.getMessage());
}
...
Run Code Online (Sandbox Code Playgroud)

每个组合都会出错:unknown protocol: steam.

Steam用来处理URI的系统肯定是有效的,因为例如,我可以在Firefox中输入上面的URI并且它可以工作.

我永远感谢提供答案的人!

谢谢

java uri

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

C优化问题

我想知道什么是我能编写代码的最快方法.我有一个循环,在一些int上执行添加.循环将执行很多次,所以我想过进行比较以检查是否有任何操作数为零,因此不应该考虑添加它们,如下所示:

if (work1 == 0)
{
    if (work2 == 0)
        tempAnswer = toCarry;
    else
        tempAnswer = work2 + toCarry; 
}
else if (work2 == 0)
    tempAnswer = work1 + toCarry;
else
    tempAnswer = work1 + work2 + toCarry;
Run Code Online (Sandbox Code Playgroud)

我相信顶部的嵌套IF已经是一个优化,因为它比用&&编写一系列比较更快,因为我会(work1 == 0)不止一次地检查.

遗憾的是,我无法说出work1和work2的频率为零,所以假设它可能是IF语句的每个可能结果的均衡分布.

那么,鉴于此,上述代码是否比仅仅编写更快tempAnswer = work1 + work2 + toCarry或者所有比较可能会导致很多拖累?

谢谢

c optimization

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

相当于JDB中的GDB'start'?

我对JDB感到有点困惑.相当擅长使用GDB,我知道用于控制执行的各种简单命令,即start,run,cont,step,stepi,break等等,但有很多(在我看来)不寻常的差异.

如果我想启动一个应用程序(而不是运行它,所以我可以从头开始),本能地,我打字jdb MyApp然后start.我收到一个无法识别的命令错误.阅读JDB帮助没有给出任何启动命令或其等价物的指示.所以,我尝试step- 这也不起作用; 我被告知需要使用run命令启动Java VM !

显然,它必须是可能的,因为step在帮助中有一个命令解释.所以,我认为也许我可以键入run并快速按ctrl+c下来中断它,因为在GDB中,这会停止执行.相反,它只是退出JDB.

我试过谷歌搜索,但无济于事.我希望我不是完全盲目的愚蠢!

Rant over:你到底是怎么开始在JDB中运行一个java应用程序,以便从一开始就可以执行它?

java gdb jdb

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

在 C 中使用硬件定时器

好的,所以我有一些 C 代码来执行数学运算,这几乎可以花费任何时间(当然,这取决于提供给它的操作数)。我想知道是否有一种方法可以注册某种方法,该方法每n秒调用一次,可以分析操作的状态,即它当前处于什么迭代,可能使用硬件定时器中断或其他什么?

我问这个的原因是因为我知道实现这一点的常用方法是跟踪变量中的当前迭代;比如说,一个整数被调用progress并且在代码中有一个像这样的 IF 语句:

if ((progress % 10000) == 0)
    printf("Currently at iteration %d\n", progress);
Run Code Online (Sandbox Code Playgroud)

但我相信一个 mod 操作需要相对较长的时间来执行,所以从优化的角度来看,将它放在一个循环中的想法会运行很多很多次让我感到害怕。

所以我觉得有一种外部方式来表示进度打印是好的和有效的。有什么好的方法可以执行此操作,还是简单的“mod 检查”是最好的(在优化方面)?

c linux optimization modulo

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

旅行推销员意外分段故障

我正在尝试为C99中的旅行商问题实施我自己的深度优先搜索算法,但是我遇到了意外的分段错误.

我有一小部分节点(大致)对应于英国的地方,它们之间有对称的路径.问题发生在newNode()方法的早期,我创建一个新节点并设置其初始状态.这涉及为节点创建一个路径数组,它将指定连接的节点和它们之间的"距离",其中每个路径的节点元素初始化为NULL.数组比我目前实现的示例图所需的要大得多(参见参考资料MAX_PATHS),因此以后很容易扩展.

paths在这种情况下,数组可以包含16个元素.初始化此数组的FOR循环在何时引发分段错误i = 3.之所以完全逃避我.我gdb在代码下面添加了一些输出.希望它有所帮助,或者您可能更喜欢使用自己的方法.

谢谢; 任何帮助将不胜感激!

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

#define NODES 4
#define MAX_PATHS 16

typedef struct _node_t node_t;
typedef struct _path_t path_t;

struct _node_t
{
    char name[64];
    struct _path_t* paths;
};

struct _path_t
{
    struct _node_t* node;
    int dist;
};

node_t* nodes[NODES];

node_t* newNode(char* name)
{
    node_t* toReturn = (node_t*) malloc(sizeof(node_t*));

    if (toReturn == NULL)
    {
        perror("malloc");
        exit(EXIT_FAILURE);
    }

    printf("toReturn (%p)\n", toReturn);

    strcpy(toReturn->name, name);

    toReturn->paths = …
Run Code Online (Sandbox Code Playgroud)

c traveling-salesman segmentation-fault

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

在IF语句中读写变量

我希望在单个IF语句中执行以下步骤以节省代码编写:

如果retTRUE,则设置ret为函数的结果lookup().如果ret是,现在FALSE,打印错误消息.

我写的代码如下:

BOOLEAN ret = TRUE;

// ... functions assigning to `ret`

if ( ret && !(ret = lookup()) )
{
    fprintf(stderr, "Error in lookup()\n");
}
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这并不像它看起来那么简单.在IF语句中读取,分配和读取同一变量.据我所知,编译器将始终根据优先级将这样的语句拆分为组成操作,并一次评估一个合并,在将操作数评估为false时立即失败,而不是全部评估它们.如果是这样,那么我希望代码遵循我上面写的步骤.

我已经在IF语句中使用了很多作业,我知道它们可以正常工作,但事先没有另外读过.

有什么理由说这不是好代码吗?就个人而言,我认为它易于阅读且含义清晰,我只是担心编译器可能因为某种原因而无法生成等效逻辑.也许编译器供应商的差异,优化或平台依赖可能是一个问题,但我对此表示怀疑.

c++

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