cout/stdout在execvp()之后不起作用
cout/stdout not working after execvp()
所以我正试图在我正在编写的一个短程序中使用unistd.h
中的execvp()
。然而,由于一些奇怪的原因,在调用execvp
函数后,我似乎失去了使用cout
甚至printf
的能力。
例如:
pid_t pid;
int status;
if ((pid = fork()) > 0) {
waitpid(pid, &status, 0);
}
else {
execvp(argv[1], &argv[1]);
}
cout << "DONE!" << endl;
但这不起作用:
execvp(argv[1], &argv[1]);
cout << "DONE!" << endl;
虽然这不是一个大问题,但我想了解为什么会发生这种情况。当我在这里和谷歌上搜索时,我一直找不到任何相关的东西。
不确定这是否与问题有关,但我将-std=c++11
标志与g++
一起使用。
这将不适用于
execvp(argv[1], &argv[1]);
cout << "DONE!" << endl;
因为函数execvp()
永远不会返回(如果成功的话)。
它用一个新的映像替换当前进程并执行该映像。
另一方面,这项工作:
if ((pid = fork()) > 0) {
waitpid(pid, &status, 0);
}
else {
execvp(argv[1], &argv[1]);
}
cout << "DONE!" << endl;
这里发生的是fork()
创建了一个新的进程。所以现在在同一个地方有两个过程。
- 一个进程将变量
pid
设置为零(这是父进程)。它进入if statement
的第一个分支,在那里等待子分支完成 - 一个进程将变量
pid
设置为零(这是子进程)。它进入第二个分支。它执行从不返回的execvp()
。它不会返回,因为进程映像已被另一个可执行文件替换
注意你真正应该做的是:
if ((pid = fork()) > 0) {
waitpid(pid, &status, 0);
cout << "Child Finished!" << endl;
}
else {
execvp(argv[1], &argv[1]);
// This code should never execute if everything is OK.
cout << "Child failed to start" << endl;
exit(1);
}
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 比较字符串的 GetLine 工作一次,然后比较之后不起作用
- 将指针传递给函数在简单的情况下有效,但在"class" -izing 之后不起作用
- 我的程序在SCANF语句之后不起作用
- OpenCV Canny 之后的 ConvexPoly 不起作用
- 我的 for 循环之后的代码不起作用,for 循环后的打印语句不会被打印
- % 在 rand() c++ 之后不起作用
- 字符串运算符 += 有时在 string::resize() 之后不起作用
- setOverrideCursor(Qt::WaitCursor) 如果在消息框之后调用,则不起作用
- 在 msgget() 之后,cout 或 printf 不起作用
- 为什么你完成我在点之后不起作用
- 在 Ctrl+Z (EOF) 之后从 iostream::cin 恢复读取?("ignore"不起作用)
- cout/stdout在execvp()之后不起作用
- 在C++中读取一行之后的行不起作用
- 为什么我的第一个 if 语句有效,但我的 else if 语句在它之后不起作用
- 为什么 exec() 在 chroot() 之后不起作用?
- "fwrite"在"fread"之后不起作用?
- cin.getline() 在 cin 之后不起作用