我最近在Linux中一直在使用消息队列(系统V,但POSIX也应该没问题),它们看起来非常适合我的应用程序,但在阅读了Unix编程的艺术之后,我不确定它们是否真的是一个不错的选择.
http://www.faqs.org/docs/artu/ch07s02.html#id2922148
System V IPC的上层消息传递层已基本停止使用.较低层由共享内存和信号量组成,在需要进行互斥锁定和在同一台机器上运行的进程之间进行一些全局数据共享的情况下,仍然具有重要的应用程序.这些System V共享内存工具演变为POSIX共享内存API,支持Linux,BSD,MacOS X和Windows,但不支持经典MacOS.
http://www.faqs.org/docs/artu/ch07s03.html#id2923376
System V IPC工具存在于Linux和其他现代Unix中.但是,由于它们是遗留功能,因此不会经常使用它们.到2003年中期,Linux版本仍然存在漏洞.似乎没有人足够关心它们.
在最近的Linux版本中,System V消息队列是否仍然存在错误?我不确定作者是否意味着POSIX消息队列应该没问题?
似乎套接字几乎是任何东西(?)的首选IPC,但我看不出用套接字或其他东西实现消息队列是多么简单.或者我的想法太复杂了?
我不知道我是否正在使用嵌入式Linux?
我一直在考虑环境变量,并有一些问题/观察.
putenv(char *string);
这个电话似乎有致命的缺陷.因为它不复制传递的字符串,所以无法使用本地调用它,并且无法保证堆分配的字符串不会被覆盖或意外删除.此外(尽管我还没有测试过),因为环境变量的一个用途是将值传递给子环境,如果子进程调用其中一个exec*()函数,这似乎没用.我错了吗?
Linux手册页指出glibc 2.0-2.1.1放弃了上述行为并开始复制字符串,但这导致了glibc 2.1.2中修复的内存泄漏.我不清楚这个内存泄漏是什么或它是如何修复的.
setenv()复制字符串,但我不确切知道它是如何工作的.当进程加载但是它被修复时,将分配环境空间.这里有一些(任意?)惯例吗?例如,在env字符串指针数组中分配比当前使用的更多的插槽,并根据需要向下移动空终止指针?是否在环境本身的地址空间中分配了新的(复制的)字符串的内存,如果它太大而不适合您只需获得ENOMEM?
考虑到上述问题,有什么理由,更喜欢putenv()过setenv()?
规则是什么?OTOH的简单案例似乎意味着新类型是最后一件事.像这里Uchar是新类型:
typedef unsigned char Uchar;
Run Code Online (Sandbox Code Playgroud)
但是函数指针完全不同.这里的新类型是pFunc:
typedef int (*pFunc)(int);
Run Code Online (Sandbox Code Playgroud)
我无法想到任何其他的例子,但我遇到了一些非常令人困惑的用法.
那么有规则还是人们应该从经验中知道这是怎么做的,因为他们之前已经看过这样做了?
另外:a的范围是typedef什么?
我没有被翻转我真的不明白.我刚读了一大堆关于它们的材料,我无法弄清楚用例.我并不是在谈论如此多的关于API的问题,因为它比signal()这样的优点足够清晰.相反,似乎RT信号是用户空间生成但是到底是什么?唯一的用途似乎是原始的IPC,但一切都指向它们是一种糟糕的IPC形式(例如笨拙,有限的信息,不是特别有效等).
那么他们在哪里以及如何使用?
以下程序显示我们可以使用return()或pthread_exit()返回可用于pthread_join()的状态变量的void*变量.
(1)是否应优先使用一个而不是另一个?
(2)为什么使用return()有效?通常我们会想到返回将值放在堆栈上但是由于线程已经完成,堆栈应该消失.或者堆栈是否在pthread_join()之后才被销毁?
(3)在你的工作中,你是否看到很多地方变量的使用?我看到90%的代码看起来只是NULL状态参数.因为通过void*ptr改变的任何东西已经反映在调用线程中,所以返回它似乎没什么意义.返回的任何新的void*ptr都必须指向由开始线程进行malloc化的东西,这使得接收线程有责任处理它.我认为状态变量是无意义的,我错了吗?
#include <iostream>
#include <pthread.h>
using namespace std;
struct taskdata
{
int x;
float y;
string z;
};
void* task1(void *data)
{
taskdata *t = (taskdata *) data;
t->x += 25;
t->y -= 4.5;
t->z = "Goodbye";
return(data);
}
void* task2(void *data)
{
taskdata *t = (taskdata *) data;
t->x -= 25;
t->y += 4.5;
t->z = "World";
pthread_exit(data);
}
int main(int argc, char *argv[])
{
pthread_t threadID;
taskdata t = {10, 10.0, "Hello"};
void *status;
cout …Run Code Online (Sandbox Code Playgroud) 所以我正在浏览linux glibc源代码,但我看不到它实际上做了什么.以下是来自io/chdir.c但它表明了许多源文件.这里发生了什么?显然我错过了一些东西.秘诀是什么,它在哪里进行系统调用或实际执行某些操作?
stub_warning是一些遗留的疯狂. __set_errno似乎是一个简单的宏设置errno.虽然我发现一百万用法,但weak_alias我没有看到它在任何地方定义.
是否有一个有用的指南来了解glibc如何在某处工作?
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
/* Change the current directory to PATH. */
int
__chdir (path)
const char *path;
{
if (path == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
stub_warning (chdir)
weak_alias (__chdir, chdir)
#include <stub-tag.h>
Run Code Online (Sandbox Code Playgroud) 我们假设为典型的服务器 - 客户端程序创建了一个Unix域套接字.客户端在套接字上发送10GB缓冲区,同时由服务器使用.
操作系统(Linux/BSD)将10GB缓冲区分成多个数据包并发送/使用它们,还是一次性发送?
如果不能一次发送10GB的域套接字缓冲区,那么单个数据包的实际大小限制是多少?
约束:
对不起,我知道这是愚蠢的但linux libc源代码在哪里?我从GNU下载的内容似乎不是我想要的,特别是我在pthreads函数系列中找不到任何内容.
某处是否存在在线(高压交叉引用)版本?
浏览C++ 0x书中的货币并认为我会给出示例代码.它是基本的.
#include <iostream>
#include <thread>
void hello()
{
std::cout<<"Hello Concurrent World\n";
}
int main(int argc, char *argv[])
{
std::thread t(hello);
t.join();
}
Run Code Online (Sandbox Code Playgroud)
编译:
g++ -std=c++0x -g -o pgm pgm.cpp
Run Code Online (Sandbox Code Playgroud)
热潮:
Program received signal SIGSEGV, Segmentation fault.
_dl_fixup (l=0x7ffff7b0992c, reloc_arg=<value optimized out>) at ../elf/dl-runtime.c:147
147 ../elf/dl-runtime.c: No such file or directory.
in ../elf/dl-runtime.c
Run Code Online (Sandbox Code Playgroud)
似乎是某种设置/库问题.有人熟悉这个吗?
我很难让我的脑袋围绕如何初始化矢量矢量.
typedef vector <vector <vector <vector <float >>>> DataContainer;
我希望这符合
level_1 (2 elements/vectors)
level_2 (7 elements/vectors)
level_3 (480 elements/vectors)
level_4 (31 elements of float)
Run Code Online (Sandbox Code Playgroud)
解决要素不是问题.这应该像一样简单
dc[0][1][2][3];
Run Code Online (Sandbox Code Playgroud)
问题是我需要在文件中填写无序的数据,以便连续的项目需要放置
dc[0][3][230][22];
dc[1][3][110][6]; //...etc
Run Code Online (Sandbox Code Playgroud)
所以我需要事先初始化V的V值.
我是在哄自己还是这么简单
for 0..1
for 0..6
for 0..479
for 0..30
dc[i][j][k][l] = 0.0;
Run Code Online (Sandbox Code Playgroud)
它似乎不应该工作.不知何故,必须首先初始化顶层向量.
任何帮助赞赏.我相信这一定比我想象的要简单.