Articles of c + +

在rshd.c源代码中缺lesspam_appl.h和pam_misc.h

我正在使用一个centOS 5.5操作系统 。 它显示/security/pam_appl.h和/security/misc.h文件丢失的错误。 其实我的rshd.c不加载PAM模块,可能是通过把这个库,它帮助我工作我的rshd罚款。 这就是为什么我发布这个问题。 错误:- rshd.c:90:31: error: security/pam_appl.h: No such file or directory rshd.c:91:31: error: security/pam_misc.h: No such file or directory 我search了很多,但没有得到任何有用的rpm给这些文件。 一些链接在这里 。 但不适合centOS。 帮我。 告诉我怎样才能克服这个问题。 编辑否1 你的第三个链接似乎有用。 当我尝试安装pam-devel时,显示一些错误。 当我跑步 ./configure –prefix=/usr \ –sysconfdir=/etc \ –docdir=/usr/share/doc/Linux-PAM-1.1.6 \ –disable-nis && make 它检查一些variables,然后它使对象文件,但最后显示, make[3]: *** [pam_xauth.lo] Error 1 make[3]: Leaving directory `~/Linux-PAM-1.1.6/modules/pam_xauth' make[2]: *** […]

确定两个文件path是否指向Linux / C下的同一个文件?

在Linux下,我有两个文件pathA和B: const char* A = …; const char* B = …; 我现在想确定,我应该open(2)他们两个… int fda = open(A, …); int fdb = open(B, …); …我会得到两个文件句柄打开文件系统中的同一个文件? 为了确定这一点,我想到了stat(2) : struct stat { dev_t st_dev; ino_t st_ino; … } 像(伪代码): bool IsSameFile(const char* sA, const char* sB) { stat A = stat(sA); stat B = stat(sB); return A.st_dev == B.st_dev […]

我应该释放在Linux中getpwuid()返回的指针吗?

在我调用getpwuid(uid)后,我有一个指针的引用。 我应该释放,当我不使用它了? 阅读手册页,它说它引用了一些静态区域,这可能会被随后调用相同的函数覆盖,所以我确信我是否应该触摸那个内存区域。 谢谢。

优化C ++二维数组

我需要一种方法来表示C ++中的双精度二维数组(密集matrix),并具有绝对最小的访问开销。 我已经在各种linux / unix机器和gcc版本上做了一些时机。 STLvectorvector,声明如下: vector<vector<double> > matrix(n,vector<double>(n)); 并且通过matrix[i][j]进行访问比访问声明的数组慢5%到100% double *matrix = new double[n*n]; 通过内联索引函数matrix[index(i,j)] ,其中index(i,j)计算结果为i + n * j。 其他不用STL排列二维数组的方法 – 一个n指针数组指向每一行的开始,或者定义堆栈上的整个事物为一个常数大小的matrix[n][n] – 几乎完全相同速度为指标函数法。 当开启优化时,最近的GCC版本(> 4.0)似乎能够将STLvector向量编译成几乎与非STL代码相同的效率,但这有点依赖于机器。 我想尽可能使用STL,但是必须select最快的解决scheme。 有没有人有任何与GCC优化STL的经验?

我如何与shm_open共享现有的内存?

在Linux中,我想与其他进程共享我的进程的一些内存内容。 其中一种方法是使用shm_open和mmap。 如下所示。 /* Create a new memory object */ fd = shm_open( "/bolts", O_RDWR | O_CREAT, 0777 ); if( fd == -1 ) { fprintf( stderr, "Open failed:%s\n", strerror( errno ) ); return EXIT_FAILURE; } /* Set the memory object's size */ if( ftruncate( fd, sizeof( *addr ) ) == -1 ) { fprintf( […]

在Mono中运行的C#应用​​程序中更改当前的Linux用户?

我正在为Linux系统开发一个库(CLI程序集)。 我想为库的用户提供一种切换当前有效的用户和组的方法。 主要原因是提供访问控制(某些用户只允许某些操作),其次是以特定的用户来修改文件系统。 我已经确定了两种可能的方法: 1.以root用户身份启动Mono,并调用像seteuid等libc例程 通过设置/ usr / bin / mono的位来实现这一点,然后从我的库中(即在Mono运行时启动之后)设置有效的用户,会在Mono终止时导致崩溃: ERROR:handles.c:1940:_wapi_handle_update_refs: assertion failed: (thr_ret == 0) Native stacktrace: mono2 [0x8bb6c] /lib/libc.so.6(__default_rt_sa_restorer_v2+0) [0x4020a5a0] /lib/libc.so.6(gsignal+0x40) [0x4020920c] 从逻辑上讲,我知道在更换Mono的有效用户方面可能存在问题,因为它正在pipe理大量资源,并且可能会导致问题发生。 2.在本地守护进程中处理身份validation,不要更改单声道有效用户 我不确定是否有任何现成的解决scheme,但在概念上,我想有一个守护进程作为根运行,库将通信(例如通过POSIX消息队列)来执行身份validation。 守护程序以root用户身份运行,以便能够读取/ etc / shadow。 Mono的有效用户不会改变,但是我的图书馆会跟踪哪个“等效用户”进程正在运行。 不幸的是,这种方法不允许库作为不同的用户访问文件系统。 题 我坚持第二个选项,还是有一些方法来真正改变一个单声道进程的有效用户? 谢谢!

dlclose并不真正卸载共享对象,无论它被调用了多less次

我的程序使用dlopen来加载一个共享对象,然后dlclose卸载它。 有时这个共享对象再次加载。 我注意到静态variables没有重新初始化(这对我的程序是至关重要的),所以我在dlclose后添加了一个testing(使用RTLD_NOLOAD dlopen )来查看库是否真的被卸载。 果然,这仍然是在记忆中。 然后我试着重复调用dlclose直到这个库真的被卸载,但是我得到的是一个无限循环。 这是我用来检查库是否卸载的代码: dlclose(handles[name]); do { void *handle = dlopen(filenames[name], RTLD_NOW | RTLD_NOLOAD); if (!handle) break; dlclose(handle); } while (true); 我的问题是, dlclose后,我的共享对象没有被卸载的可能原因是什么,因为我的dlopen调用是唯一加载的地方。 你能提出一个行动路线来追踪问题的根源吗? 另外,为什么重复调用dlclose没有任何作用,它们都是递减引用计数,不是吗? 编辑:刚刚发现这只发生在我用gcc编译时。 随着叮当 ,一切都很好。

什么是pthread取消点用于?

关于几个问题,讨论了pthread取消点( http://man7.org/linux/man-pages/man3/pthread_cancel.3.html )。 在某些情况下,被调查者说除非程序员知道他们做得很好,否则不应使用取消点。 我的问题—什么是pthread取消点用于? [从评论更新] 取消点是否允许取消那些特定的API调用? 为什么这些而不是其他人? 任何人都想使用他们的东西吗? 他们是在内核中解决问题的黑客攻击手段吗?或者他们是在POSIX系统中固有的东西? 你想在用户级代码中使用取消点还是只在API中使用取消点?

如何使用Linux的splice()函数将文件复制到另一个文件?

这里是关于splice()的另一个问题。 我希望使用它来复制文件,并试图使用拼接的维基百科页面上的例子一样的pipe道连接的两个拼接调用。 我写了一个简单的testing用例,它只尝试从一个文件读取第一个32K字节,并将它们写入另一个文件: #define _GNU_SOURCE #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> int main(int argc, char **argv) { int pipefd[2]; int result; FILE *in_file; FILE *out_file; result = pipe(pipefd); in_file = fopen(argv[1], "rb"); out_file = fopen(argv[2], "wb"); result = splice(fileno(in_file), 0, pipefd[1], NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE); printf("%d\n", result); result = splice(pipefd[0], […]

如何使用waf来构build共享库?

我想用waf来构build一个共享库,因为它看起来比GNU自动工具更容易,更简单。 到目前为止,我还有几个与我开始写的wscript有关的问题: VERSION='0.0.1' APPNAME='libmylib' srcdir = '.' blddir = 'build' def set_options(opt): opt.tool_options('compiler_cc') pass def configure(conf): conf.check_tool('compiler_cc') conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb') def build(bld): bld.new_task_gen( features = 'cc cshlib', source = '*.c', target='libmylib') 包含source = '*.c'的行不起作用。 我必须指定每个.c文件而不是使用通配符吗? 例如,我怎样才能启用一个debugging版本(目前wscript正在使用debugging版本的CFLAGS,但我想使最终用户可选)。 计划将图书馆的资源放在一个子目录中,并且在自己的子目录中使用这些图书馆的程序。