标签: linux

Linux内核中可能/不太可能的宏如何工作以及它们的好处是什么?

我一直在挖掘Linux内核的某些部分,发现这样的调用:

if (unlikely(fd < 0))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

要么

if (likely(!err))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

我找到了它们的定义:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
Run Code Online (Sandbox Code Playgroud)

我知道它们是为了优化,但它们是如何工作的?使用它们可以预期性能/尺寸减少多少?至少在瓶颈代码中(当然在用户空间中)是否值得麻烦(并且可能失去可移植性).

linux gcc linux-kernel likely-unlikely

331
推荐指数
6
解决办法
13万
查看次数

如何从当前Linux shell运行具有不同工作目录的程序?

使用Linux shell,如何从当前工作目录启动具有不同工作目录的程序?

例如,我有一个二进制文件helloworld,hello-world.txt在当前目录中创建该文件.该文件位于目录中/a.目前我在目录中/b.我想启动我的程序运行../a/helloworldhello-world.txt在第三个目录中的某个位置/c.

linux shell environment

327
推荐指数
7
解决办法
24万
查看次数

如何通过名称而不是PID来终止进程?

例如,有时当我尝试启动Firefox时,它表示Firefox进程已在运行.所以我必须这样做:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451
Run Code Online (Sandbox Code Playgroud)

我想要的是一个可以为我做这一切的命令.它将在进程列表中为它(或其他)获取输入字符串和grep,并将终止输出中的所有进程:

jeremy@jeremy-desktop:~$ killbyname firefox
Run Code Online (Sandbox Code Playgroud)

我尝试在PHP中执行它但exec('ps aux')似乎只显示在PHP脚本本身中使用exec()执行的进程(因此它显示的唯一进程本身.)

linux bash shell

321
推荐指数
12
解决办法
43万
查看次数

什么是LD_PRELOAD技巧?

我最近在proggit看到了它的引用,并且(截至目前)它没有被解释.

我怀疑可能是它,但我不确定.

c linux environment-variables

321
推荐指数
6
解决办法
29万
查看次数

加载共享库时出现Linux错误:无法打开共享对象文件:没有此类文件或目录

Program是Xenomai测试套件的一部分,从Linux PC交叉编译为Linux + Xenomai ARM工具链.

# echo $LD_LIBRARY_PATH                                                                                                                                          
/lib                                                                                                                                                             
# ls /lib                                                                                                                                                        
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so                                                                                                       
ld-linux.so.2       libdl.so.2          libpthread.so.0                                                                                                          
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so                                                                                                         
libc.so.6           libgcc_s.so.1       libstdc++.so.6                                                                                                           
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9                                                                                                       
libcrypt.so.1       libm.so.6                                                                                                                                    
# ./clocktest                                                                                                                                                    
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory                                 
Run Code Online (Sandbox Code Playgroud)

编辑:好的我没注意到.1的结尾是文件名的一部分.这究竟是什么意思?

linux shared-libraries file-not-found xenomai

321
推荐指数
11
解决办法
105万
查看次数

Git 子模块更新失败,并显示“致命:在存储库中检测到可疑的所有权”

我在我的 Linux 工作站上安装了一个新的硬盘驱动器。看起来效果很好。我想在新磁盘中下载一些存储库。所以我执行了git clone XXX,效果很好。但是当我在文件夹中cd并执行git submodule update --init --recursive. 它失败了

fatal: detected dubious ownership in repository at '/media/data/users/jhu3szh/serialize'
To add an exception for this directory, call:

git config --global --add safe.directory /media/data/users/jhu3szh/serialize
Run Code Online (Sandbox Code Playgroud)

我想也许这只是一个轻微的警告,所以我就执行了git config --global --add safe.directory /media/data/users/jhu3szh/serialize。然而,当我再次执行 Git 子模块时,又出现了更多类似的错误。存储库中有许多子模块。

发生的事情有何解释?

linux filesystems git ubuntu cve-2022-24765

320
推荐指数
8
解决办法
53万
查看次数

如何限制递归文件列表的深度?

有没有办法限制linux中递归文件列表的深度?

我目前使用的命令是:

ls -laR > dirlist.txt
Run Code Online (Sandbox Code Playgroud)

但是我有大约200个目录,每个目录都有10个目录.因此,它需要花费太长时间并占用太多系统资源.

我真正感兴趣的是第一级子目录的所有权和权限信息:

drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/htdocs  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/htdocs  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/htdocs …
Run Code Online (Sandbox Code Playgroud)

linux bash

319
推荐指数
4
解决办法
31万
查看次数

"#!/ usr/bin/env bash"和"#!/ usr/bin/bash"有什么区别?

bash脚本的标题中,这两个语句之间的区别是什么?

  1. #!/usr/bin/env bash

  2. #!/usr/bin/bash

当我试图看到env手册页时,我得到了这个定义:

 env - run a program in a modified environment
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

unix linux bash shell shebang

319
推荐指数
4
解决办法
13万
查看次数

由于stdin不是终端,因此不会分配伪终端

我正在尝试编写一个shell脚本,在远程服务器上创建一些目录,然后使用scp将文件从本地计算机复制到远程服务器上.这是我到目前为止所拥有的:

ssh -t user@server<<EOT
DEP_ROOT='/home/matthewr/releases'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR=$DEP_ROOT"/"$datestamp
if [ ! -d "$DEP_ROOT" ]; then
    echo "creating the root directory"
    mkdir $DEP_ROOT
fi
mkdir $REL_DIR
exit
EOT

scp ./dir1 user@server:$REL_DIR
scp ./dir2 user@server:$REL_DIR
Run Code Online (Sandbox Code Playgroud)

每当我运行它时,我收到此消息:

Pseudo-terminal will not be allocated because stdin is not a terminal.
Run Code Online (Sandbox Code Playgroud)

脚本永远挂起.

我的公钥在服务器上是可信的,我可以在脚本之外运行所有命令.有任何想法吗?

linux ssh bash shell

316
推荐指数
8
解决办法
39万
查看次数

Windows和Linux目录名中禁止使用哪些字符?

我知道/在Linux中是非法的,以下在Windows中是非法的(我认为) * . " / \ [ ] : ; | , *

我还缺少什么?

但是,我需要一个全面的指南,并且需要考虑双字节字符.链接到外部资源对我来说没问题.

我需要首先使用可能包含禁用字符的名称在文件系统上创建一个目录,所以我打算用下划线替换这些字符.然后我需要将此目录及其内容写入zip文件(使用Java),因此有关zip目录名称的任何其他建议将不胜感激.

linux windows directory zip filenames

315
推荐指数
10
解决办法
33万
查看次数