无法在 C 中使用 system() 函数执行 "cat"
Can't execute "cat" using system() function in C
我的 C 程序中有一个函数是 SIGINT 信号的处理程序,执行时只需执行以下命令:
void sigint_handler(int sig)
{
system("cat output.txt");
exit(0);
}
问题是“cat”命令似乎没有任何作用。如果我尝试做其他事情而不是“猫”,比如“回声”,它工作正常,所以我相信问题出在“猫”而不是 system() 函数。
文件“output.txt”位于 C 程序的同一目录中,如果我尝试通过另一个 C 脚本对该文件执行 cat,它会起作用。另外,如果我尝试从 shell 执行该命令,它会起作用。
我已经检查了 system("cat output.txt")
中的 return,它是 0。那么问题是什么?
编辑:文件 output.txt 也在程序中作为 FILE 流(使用 fopen()
)由另一个线程打开,这可能是个问题吗?
您应该知道信号处理程序只能安全地调用一组受限的 async-signal-safe functions。 system()
和 exit()
都不在列表中。调用它们很可能会触发未定义的行为,从而导致不可预知的结果。
:
I see, but I don't understand why his version is working while mine is not. I declare the signal handler in the same way, but my program can't execute that "cat" command, while in his version it does.
我秒:
Sometimes things that aren't guaranteed still work despite not being guaranteed as an accident of environment or configuration. That doesn't make the code that just happens to work correct; good code relies only on documented, guaranteed semantics.
一个常见的解决方法是将信号处理代码移至主程序,并让主程序定期检查 global variable。从信号处理程序中,所有要做的就是设置全局变量和 return。这种技术可以让您随心所欲,尽管方式有些复杂。
volatile sig_atomic_t sigint_received = 0;
void sigint_handler(int sig)
{
sigint_received = 1;
}
// main program loop
for (;;) {
// do stuff
...
// check for interruption
if (sigint_received) {
system("cat output.txt");
exit(0);
}
}
我的 C 程序中有一个函数是 SIGINT 信号的处理程序,执行时只需执行以下命令:
void sigint_handler(int sig)
{
system("cat output.txt");
exit(0);
}
问题是“cat”命令似乎没有任何作用。如果我尝试做其他事情而不是“猫”,比如“回声”,它工作正常,所以我相信问题出在“猫”而不是 system() 函数。 文件“output.txt”位于 C 程序的同一目录中,如果我尝试通过另一个 C 脚本对该文件执行 cat,它会起作用。另外,如果我尝试从 shell 执行该命令,它会起作用。
我已经检查了 system("cat output.txt")
中的 return,它是 0。那么问题是什么?
编辑:文件 output.txt 也在程序中作为 FILE 流(使用 fopen()
)由另一个线程打开,这可能是个问题吗?
您应该知道信号处理程序只能安全地调用一组受限的 async-signal-safe functions。 system()
和 exit()
都不在列表中。调用它们很可能会触发未定义的行为,从而导致不可预知的结果。
I see, but I don't understand why his version is working while mine is not. I declare the signal handler in the same way, but my program can't execute that "cat" command, while in his version it does.
我秒
Sometimes things that aren't guaranteed still work despite not being guaranteed as an accident of environment or configuration. That doesn't make the code that just happens to work correct; good code relies only on documented, guaranteed semantics.
一个常见的解决方法是将信号处理代码移至主程序,并让主程序定期检查 global variable。从信号处理程序中,所有要做的就是设置全局变量和 return。这种技术可以让您随心所欲,尽管方式有些复杂。
volatile sig_atomic_t sigint_received = 0;
void sigint_handler(int sig)
{
sigint_received = 1;
}
// main program loop
for (;;) {
// do stuff
...
// check for interruption
if (sigint_received) {
system("cat output.txt");
exit(0);
}
}