我在尝试写入文件描述符时无法理解发生了什么?它似乎覆盖了原始内容?这是预期的行为吗?
我在下面的例子中复制了这个:
$ echo "The quick brown fox ..." > example.txt
$ echo "The quick brown fox ..." >> example.txt
$ cat example.txt
The quick brown fox ...
The quick brown fox ...
$ exec 88<>example.txt
$ cat example.txt
The quick brown fox ...
The quick brown fox ...
$ echo "jumped" >&88
$ cat example.txt
jumped
ck brown fox ...
The quick brown fox ...
$ echo "jumped" >&88
$ cat example.txt
jumped
jumped
n fox ...
The quick …Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序来将一个命令传递给另一个命令。输入将来自命令行:
$ ./a.out ls '|' wc
c2 PID 6804
c1 PID 6803
PARENT PID 6802
$ 2 2 17
Run Code Online (Sandbox Code Playgroud)
为什么在提示返回后输出打印。有什么办法可以防止吗?
这是我写的代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char * argv[])
{
if(argc <= 1 )
{
printf("ERROR: No arguments passed\n");
printf("USAGE: ./pipe <command 1> | <command 2>\n");
return 1;
}
char * cmd1[50];
char * cmd2[50];
int cmd1_arg = 0;
int cmd2_arg = 0;
int pipe_num = 0;
for(int cla = 1; cla<argc; …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 init.d 脚本来启动和停止一个进程。我以 root 身份调用 init.d,但我希望它控制的进程以特定用户身份运行。
网上最常见的建议似乎是做
su myuser -c "my_process args"
Run Code Online (Sandbox Code Playgroud)
但是,这会创建第二个进程空间、新 shell 等,并且有些不雅。
我更喜欢使用exec(),因为它取代了外壳,但这不以用户为参数。这是我应该setuid()首先使用的情况吗?设置gid怎么样?有什么需要注意的问题吗?
或者,是否有特定于发行版的解决方案来以不同的用户身份运行 init.d?我的环境是Centos 6.4。
如果我开始一个进程,特别是在会话开始时,使用exec p和 有dbus-launch p什么区别?
如果我有一个文件
#!/usr/bin/env foobar
Run Code Online (Sandbox Code Playgroud)
确定此文件是否具有 hashbang 的最快/最佳方法是什么?我听说你只能读取前 2 个字节?如何?
为什么
exec >somefile
Run Code Online (Sandbox Code Playgroud)
立即返回,同时
exec 2>somefile
Run Code Online (Sandbox Code Playgroud)
不会并无限期地挂起?谢谢。
我使用fish shell,并希望能够“获取”一些用sh兼容语法编写的shell脚本,而fish无法读取这些脚本。例如,许多软件希望您提供一些 shell 脚本来导出有用的环境变量:
# customvars.sh
FOOBAR=qwerty
export FOOBAR
Run Code Online (Sandbox Code Playgroud)
如果我不关心保留局部变量和函数定义,一种解决方法是使用 exec 用 /bin/sh 替换当前进程,然后返回到fish
# We start out on fish
exec /bin/sh
Run Code Online (Sandbox Code Playgroud)
# Running a POSIX shell now
. customvars.sh
exec /usr/bin/fish
Run Code Online (Sandbox Code Playgroud)
# Back on fish
echo $FOOBAR
Run Code Online (Sandbox Code Playgroud)
有没有办法将这种模式归结为一个单行代码,我可以将其保存在某个函数中?如果我尝试做
exec /bin/sh -c '. vars.sh; /usr/bin/fish'
Run Code Online (Sandbox Code Playgroud)
我的终端模拟器窗口立即关闭,而不是带我回到交互式鱼提示。
当linux有execve()一个ELF时,它会将该ELF映射到进程的内存空间中,并从入口点开始运行代码。但是内核是如何决定ELF的加载地址和入口点的呢?
如果禁用 ASLR,它将查找.p_vaddr每个 PT_LOAD 段并使用.e_entryELF 标头作为入口点。
但是如果启用 ASLR 会怎样呢?内核是否会简单地向上述所有内容添加随机移位,但保持它们的相对位置?
ELF的内容会影响内核的行为吗?就像.p_vaddrPT_LOAD 段的最小值是零还是非零?比如.e_typeELF header是ET_DYN还是ET_EXEC?
我特别谈论的是 x86_64。
我需要用来sudo以不同的用户身份运行进程。但如何使用sudo类似exec:
sudo -u www-data exec php -r 'sleep(2); echo 5;'
Run Code Online (Sandbox Code Playgroud)
替换 sudo 进程?
为什么和要求?
sudoexec,即没有背景等。