我在Debian x64 PC上运行的c ++程序中有一个奇怪的行为。
我无法先读取文件,然后写入另一个值,然后再读取这些值。我已经阅读了很多信息,包括关于stackoverflow的问题,发现(也通过实验)我需要同时更改seekp和seekg,并且这样做了。一切正常...直到我从流中读取了一些内容。读取操作后,如果我要查找文件的开头,然后调用tellg(),tellp(),它们都将返回“ -1”。
测试代码:
void testFstreamSeekp() {
fstream in("file", ios::in | ios::out);
cout << "g: " << in.tellg() << endl;
cout << "p: " << in.tellp() << endl;
in.seekp(0, ios_base::end);
cout << "endp g: " << in.tellg() << endl;
cout << "endp p: " << in.tellp() << endl;
in.seekp(0, ios_base::end);
in.seekg(0, ios_base::end);
cout << "end g: " << in.tellg() << endl;
cout << "end p: " << in.tellp() << endl;
in.seekp(0, ios_base::beg);
in.seekg(0, ios_base::beg);
cout << "beg …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过使用unshareand newuidmap命令来更好地理解用户名称空间。
这些是我运行的命令:
[root@host ~]$ ls -l /usr/bin/newuidmap
-rwsr-xr-x 1 root root 32944 May 16 19:37 /usr/bin/newuidmap
[root@host ~]$ unshare -U bash namespace
[nobody@host ~]$ echo $$
7134
[nobody@host ~]$ newuidmap 7134 65534 5000 1
newuidmap: write to uid_map failed: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
/ etc / subuid:
nobody:5000:1
root:5000:1
Run Code Online (Sandbox Code Playgroud)
知道为什么这失败了吗?
然后,我尝试newuidmap在父命名空间的同一PID上运行命令,它似乎可以正常工作:
[root@host ~]$ newuidmap 7134 65534 5000 1
[root@host ~]$ cat /proc/7134/uid_map
65534 5000 1
Run Code Online (Sandbox Code Playgroud)
但是,当我从新名称空间中运行进程时,它似乎仍以root身份而不是UID 5000身份运行:
[nobody@host ~]$ exec sleep 20
Run Code Online (Sandbox Code Playgroud)
从另一个shell:
[root@host ~]$ …Run Code Online (Sandbox Code Playgroud) 在玩弄user_namespaces(7)的示例时,我遇到了一种奇怪的行为。
应用程序user-ns-ex使用 CLONE_NEWUSER 调用clone(2),从而在新的用户命名空间中创建一个新进程。父进程将映射 ( 0 1000 1) 写入 /proc//uid_map 文件并告诉(通过管道)子进程可以继续。然后子进程执行bash。
我在这里复制了源代码。
如果我不设置任何功能或设置所有功能,应用程序将打开 /proc//uid_map 进行写入。
当我仅设置 set_capuid、set_capgid 和可选的 cap_sys_admin 时,对 open(2) 的调用失败:
设置上限:
arksnote linux-namespaces # setcap 'cap_setuid,cap_setgid,cap_sys_admin=epi' ./user-ns-ex
arksnote linux-namespaces # getcap ./user-ns-ex
./user-ns-ex = cap_setgid,cap_setuid,cap_sys_admin+eip
Run Code Online (Sandbox Code Playgroud)
尝试运行:
kamyshev@arksnote ~/workspace/personal/linux-kernel/linux-namespaces $ ./user-ns-ex -v -U -M '0 1000 1' bash
./user-ns-ex: PID of child created by clone() is 19666
ERROR: open /proc/19666/uid_map: Permission denied
About to exec bash
Run Code Online (Sandbox Code Playgroud)
无能力:
arksnote …Run Code Online (Sandbox Code Playgroud)