标签: linux

在c中更改所有者和组

我想在c中更改文件的所有者和组.我谷歌它,但如果只找到一些使用system()和chmod命令或相关函数的代码.没有system()函数和bash命令有没有办法做到这一点?

谢谢大家.但新问题!:有没有办法在c中不使用"id -u username"命令获取用户uid和gid?解析/ etc/passwd?还是更好的方式?

c linux

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

32位Linux上的Syscall或sysenter?

从MS-DOS开始,我知道使用中断的系统调用.在旧论文中,我看到了int 80h在Linux上调用系统函数的参考.由于现在相当长的一段时间,我知道int 80h不赞成使用该syscall指令.但我不能让它在我的32位机器上工作.

这个问题

syscall指令仅用于64位平台吗?不是32位Linux使用syscall

样品测试

在我的32位Linux(Ubuntu Precise)上,该程序终止于核心转储:

global _start

_start:
        mov     eax, 4                ; 4 is write
        mov     ebx, 1                ; 1 is stdout
        mov     ecx, message          ; address of string
        mov     edx, length           ; number of bytes
        syscall

        mov     eax, 1                ; 1 is exit
        xor     ebx, ebx              ; return code 0
        syscall

message:
        db  10,"Hello, World",10,10
length  equ $ - message
Run Code Online (Sandbox Code Playgroud)

我试过sysenter而不是syscall,但它以同样的方式崩溃.

linux assembly 32-bit system-calls sysenter

8
推荐指数
2
解决办法
6401
查看次数

在x86 nasm中划分时的浮点异常

我正忙着学习装配,正在考虑分裂,但是我遇到了以下声明:

mov edx,0x00000001
mov eax,0x00000000
mov ecx,0x00000002
idiv ecx
Run Code Online (Sandbox Code Playgroud)

GDB:

   0x08048071 <+17>:    mov    edx,0x1
   0x08048076 <+22>:    mov    eax,0x0
   0x0804807b <+27>:    mov    ecx,0x2
=> 0x08048080 <+32>:    idiv   ecx
Run Code Online (Sandbox Code Playgroud)

我想将0x100000000除以0x00000002,因为除法的范围是EDX:EAX我将0x1移动到EDX,将0x0移动到EAX.然后我将0x2移动到ECX并进行除法,这不幸地给了我一个浮点异常,我不确定我做错了什么.

当使用div(无符号)时它工作正常,所以我想知道这个导致异常的特定语句在div和idiv之间的解释有什么不同.

linux x86 assembly nasm

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

如何利用自己的编程语言利用VDSO对象?

最近的Linux内核(至少在amd64上)提供了一个魔术对象文件linux-vdso.so.1,该文件将syscall接口抽象到内核,允许内核选择最佳的调用约定.如果用C编写代码,glibc会自动使用该对象.

现在,如果我想在不使用glibc的情况下编写程序,我该如何使用这个对象?它提供的界面是否记录在某处?召唤大会怎么样?

linux system-calls systems-programming

8
推荐指数
2
解决办法
6057
查看次数

为什么'dd'能够比使用ifstream的程序更快地读取管道?

我有两个程序通过linux管道(命名或其他)传递数据.我需要在两个程序之间达到~2600 MB/s的传输速率,但目前看到的速度约为~2200 MB/s.但是,我发现如果用'dd'代替我的第二个进程,传输速率会跳到3000 MB/s以上.关于我的程序从管道中读取的方式是否存在一些效率低于'dd'的方式?我该怎么做才能提高吞吐量?'ifstream'本身是否比从管道中读取二进制数据的其他方法慢?

总结这两种情况:

场景1:

程序1 - > [命名管道] - >程序2

产量~2200 MB/s传输速率

Scenario2:

程序1 - > [命名管道] - >'dd if = pipename of =/dev/null bs = 8M'

产量~3000 MB/s传输 速率.

这是我的程序2当前从管道中读取的方式:

ifstream inputFile;
inputFile.open(inputFileName.c_str(), ios::in | ios::binary);
while (keepLooping)
{
    inputFile.read(&buffer[0], 8*1024*1024);
    bytesRead = inputFile.gcount();
    //Do something with data
}
Run Code Online (Sandbox Code Playgroud)

更新:

我现在尝试使用'read(fd,&buffer [0],8*1024*1024)'代替istream,似乎显示出轻微的改善(但不如dd那么多)

我也尝试使用stream-> rdbuf() - > sgetn(&buffer [0],8*1024*1024)而不是stream-> read(),这没有用.

c++ linux pipe ifstream

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

GCC编译失败,使用pthread和选项std = c99

我有一个示例程序无法使用-std = c99进行编译

任何帮助赞赏

#include <pthread.h>
int main(void) {
    pthread_rwlock_t    myLock;
    return 0;
}

output of the two compiles:
gcc pthread_test.c
[brad@fedora17onbradsmacpro src]$ gcc  pthread_test.c
[brad@fedora17onbradsmacpro src]$

gcc -std=c99 pthread_test.c[brad@fedora17onbradsmacpro src]$ gcc -std=c99 pthread_test.c
pthread_test.c: In function ‘main’:
pthread_test.c:5:2: error: unknown type name ‘pthread_rwlock_t’
[brad@fedora17onbradsmacpro src]$
Run Code Online (Sandbox Code Playgroud)

linux gcc fedora pthreads

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

Linux内核中的模块间通信

我有两个Linux内核模块,其中一个可以为另一个提供一些功能.但是使用该功能并不重要,即使第一个模块不存在,第二个模块也可能(并且应该)工作.

如果我只是从第一个模块导出函数并在第二个模块中使用它,则第二个模块依赖于该符号,并且在没有第一个模块的情况下无法加载.

其中一个解决方案是让用户脚本在第一个模块中查看/ proc/kallsym函数,如果它出现在那里,脚本将其地址作为参数传递给第二个模块,然后将其指针从中取出.但出于明显的原因,我不喜欢这种解决方案.

如果有更正确和优雅的解决方案,将允许第二个模块在第一个模块中获取某些符号的地址,但避免硬依赖?

linux kernel

8
推荐指数
2
解决办法
3227
查看次数

如何设置RRD存储2年?

我正在监控超过300台服务器,因为我正在使用Ganglia.其中RRD用作数据库来收集和存储与每个服务器的资源相关的数据.我想有2年或更长的历史,所以阅读这篇文章,我认为我的RRA配置应该是:

RRAs "RRA:AVERAGE:0.5:1:17520"
Run Code Online (Sandbox Code Playgroud)

17520 =(365天[年] x 2)*24 [小时]

这是Ganglia默认配置,今天正在运行:

#
# Round-Robin Archives
# You can specify custom Round-Robin archives here (defaults are listed below)
#
# RRAs "RRA:AVERAGE:0.5:1:244" "RRA:AVERAGE:0.5:24:244" "RRA:AVERAGE:0.5:168:244" "RRA:AVERAGE:0.5:672:244" \
#      "RRA:AVERAGE:0.5:5760:374"
#
Run Code Online (Sandbox Code Playgroud)

这是我的思维方式还是我在这里遗漏了什么?

database linux rrdtool rrd ganglia

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

在Linux上放置命名管道的适当位置是什么?

我有一些通过命名管道相互通信的进程.目前,我在本地创建所有管道,并将应用程序保存在同一个工作目录中.在某些时候,假设这些程序可以(并且将)从不同的目录运行.我需要创建我在已知位置使用的这些管道,因此所有不同的应用程序都能够找到所需的管道.

我是Linux新手,不熟悉文件系统结构.在Windows中,我使用像AppData文件夹这样的东西来保存这些管道.我不确定Linux中的等价物是什么.

/tmp目录看起来可能很好地运行.我已经在一些地方看到它已经在系统关闭时被清除了(这很好,当我开始备份时,我可能不会重新创建管道.)但是我看到其他一些人说他们正在丢失文件当系统启动时,好像它是定期清理的,当我的应用程序使用这些管道时我不想发生这种情况!

是否有更适合特定应用商店的地方?或者/tmp是我想要保留这些的地方(因为它们毕竟是暂时的).

linux filesystems pipe named-pipes tmp

8
推荐指数
2
解决办法
2882
查看次数

我们可以在内核空间中调用系统调用吗?

有时,当我们必须在内核系统中调用系统调用时,我们调用它的帮助器或相关的内核函数,而不是'syscall'.我仍然想知道我们可以在内核空间中调用系统调用吗?如果没有,是什么阻止我们这样做.

我的问题有点奇怪.

linux kernel system-calls

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