无法以正确的方式执行其他程序
Can't exec other programs in a proper way
我正在尝试从自己的内部执行另一个程序,但我不了解一些事情。所以我写了此代码:
void run() {
cout << "##Run" << endl;
pid_t process_id = fork();
if (process_id == 0) {
char* args[] = { "sudo", "ls", "-l" };
auto i = execvp("sudo", args);
cout << "#Result: " << i << endl;
return;
} else if (process_id < 0) {
throw std::runtime_error("fork() failed");
} else if (process_id > 0) {
wait(&process_id);
}
return;
}
void run_decorator() {
cout << "###Run decorator: " << endl;
run();
}
int main() {
run();
run_decorator();
return 0;
}
,输出为
##Run
total 88
-rwxr-xr-x 1 bezik bezik 77560 Nov 29 19:53 colors
-rwxr-xr-x 1 bezik bezik 63 Nov 26 21:45 compile
drwxr-xr-x 2 bezik bezik 4096 Nov 26 20:46 headers
drwxr-xr-x 2 bezik bezik 4096 Nov 23 00:48 sources
###Run decorator:
##Run
#Result: -1
有人可以向我解释,为什么从run_decorator()函数调用execvp失败?
读取仔细 execvp(3)的文档。它说execl
等...
第一个论点,按照惯例,应指向 与正在执行的文件关联的文件名。列表 参数必须由空指针终止,并且由于这些是 variadic功能,此指针必须施放
(char *) NULL
。
以及关于execvp
:
指针的数组必须由空指针终止。
因此您应该代码:
char* args[] = { "sudo", "ls", "-l", NULL };
execvp("sudo", args);
btw, execvp
根本不返回,失败。通话后无需保留结果。
但是您需要,当execvp
返回时(这仅在失败时发生)显示一些错误消息。我建议:
perror("execvp");
exit(EXIT_FAILURE);
,您可以找到有效的参数要调用,在这种确切的情况下,_EXIT(2)而不是退出(3)。我仍然更喜欢exit
(因为它会冲洗STDIO缓冲区并运行Atexit(3)注册的处理程序)。
有人可以向我解释,为什么
execvp
失败
是的,errno(3)。Perror(3)。
使用不要忘记阅读 每个使用的功能的文档。对于系统调用(在SYSCALLS(2)中列出)和标准C库功能(请参见Intro(3)),您通常应处理故障情况(通常使用errno
,至少通过perror
,然后通过exit
)
我不明白为什么您需要sudo
使用ls
。在很少有情况下,由于您的工作目录是可列出的(然后sudo
是没有用的),因此您甚至可以使用stat(2)(2)(2)(3)因此无需fork
,然后execvp
/bin/ls
程序)。
还阅读有关执行(2)和凭据(7)(以及setReuid(2))的setuid技术的信息。请参阅此(您可以使用自己的setuid程序避免使用sudo
)。
顺便说一句,您应该使用所有警告和调试信息(带有GCC的g++ -Wall -Wextra -g
)进行编译,并使用调试器gdb
(也许是Strace(1)和Valgrind(1))。
- 程序按执行方式工作,直到我向其添加析构函数为止
- 在服务器上执行操作的正确和 REST 方式?
- 在Visual C ++中与Stockfish(外部可执行文件)通信的最佳方式
- 在 Windows 命令行中运行.exe在使用 2 种相同方式执行时会产生不同的输出
- 无法以正确的方式执行其他程序
- 执行随机开关函数的QT方式是什么连续两次使用相同情况的方法
- 优雅地尝试以特定的方式执行各种功能
- 如果 QApplication 执行延迟,QWebEngineView 在加载内容时会以静默方式失败
- 为什么程序没有以正确的方式执行
- 如果与未使用的库链接,可执行文件的构建方式是否不同?
- pi的倍数到千分之一的值可能会改变循环执行方式
- 优雅的方式来执行许多闹钟
- 可执行文件在被复制时以某种方式损坏
- 使用 Linux Eclipse,我可以以编程方式判断我正在调试器 (gdb) 中执行
- 为什么 GNU ld 在链接可执行文件和共享对象时以不同的方式解析符号
- Visual Studio-在逐步执行时查看堆栈大小增长的方式
- 使用C++以编程方式执行静默安装
- 如何在没有弹出cmd窗口的情况下以c ++静默方式执行shell程序
- 给定一个期货容器,如何以非阻塞的方式执行所有获取
- 有没有办法在C++中以编程方式执行 adb 命令?这C++部分代码是使用 android Studio 中的 ndk b