C中system()的问题
我对C语言编程相当陌生。我正在使用Mac电脑,我刚刚用Matlab创建了这个应用程序。这个应用程序的作用是,根据一些数据创建一个.txt文件。当我直接从终端运行它时,它会创建我的.txt文件,但当我尝试使用以下代码(第一个测试代码)执行此应用程序时: 我得到了与终端相同的打印输出,但它没有生成我的.txt文件 有人知道原因吗 泰 根据您的建议,我最近将代码更改为(将上一个程序保留在另一个代码中以防万一): 它仍然执行应用程序,现在不再像system()那样打印应用程序的消息,但它仍然不会创建我可以通过从终端执行来获得的my.txt。更准确地说,system()确实创建了my.txt,但在程序执行后会将其删除C中system()的问题,c,matlab,C,Matlab,我对C语言编程相当陌生。我正在使用Mac电脑,我刚刚用Matlab创建了这个应用程序。这个应用程序的作用是,根据一些数据创建一个.txt文件。当我直接从终端运行它时,它会创建我的.txt文件,但当我尝试使用以下代码(第一个测试代码)执行此应用程序时: 我得到了与终端相同的打印输出,但它没有生成我的.txt文件 有人知道原因吗 泰 根据您的建议,我最近将代码更改为(将上一个程序保留在另一个代码中以防万一): 它仍然执行应用程序,现在不再像system()那样打印应用程序的消息,但它仍然不会创建我可
任何关于为什么不打印我的应用程序消息以及为什么创建它但删除它的建议?尝试使用“bash run\u test\u Exe\u D2O.sh”或“sh run\u test\u Exe\u D2O.sh”代替原始脚本文件名。另外,您确定脚本文件名中的空格可以吗?您正在尝试执行以下程序: “/Users/pepe1503/Documents/Pepe/Stage\u Bruker/HS\u Conversion\u Topspin\u Bucket\u Matlab/Matlab/MP\u ToolBox/small\u ToolBox/test\u Exe\u D2O/distrib”
你确定这是你想要的吗 好的,我找到了答案。问题在于它在每次使用Xcode时都会创建一个临时文件。它在其中存储我的.txt文件 正如@Remo.D已经提到的,显然您复制到test_Exe的字符串有问题。但我想在此指出几个问题:首先,使用
system()
是一个可怕的想法,使用fork()
和exec()
。其次,在C语言中,字符串的末尾总是需要NUL终止strcpy
不会添加终止null,因此您的程序容易出现分段错误/缓冲区溢出。使用strncpy(test_Exe,这里是你的字符串)。sizeof(test_Exe)-1)
而不是你希望test_Exe保存什么字符串?Hi@hhachem我要执行的程序是:“Users/pepepepe1503/Documents/Pepe/Stage\u Bruker/HS_Conversion\u Topspin\u Bucket\u Matlab”/matlab/MP_ToolBox/small_ToolBox/test_Exe_D2O/distrib/run_test_Exe_D2O.sh”使用这两个参数:“/Applications/matlab/matlab_Compiler_Runtime/v715”和“/Users/pepepepe1503/Documents/Pepe/Stage_Bruker/HS_Conversion_Topspin_Bucket_matlab”/matlab/MP_工具箱/small_工具箱/D20/nmr/Agrifood_鱼子酱_鲟鱼_D2O/4/pdata”。总字符串:@hhachem我对使用C编程很陌生,你能给我一个如何使用fork()和exec()的例子吗?检查这个链接,看一个例子:嘿!谢谢你的回答:我正在尝试执行:/Users/pepe1503/Documents/Pepe/Stage\u Bruker/HS\u Conversion\u Topspin\u Bucket\u Matlab/Matlab/MP\u ToolBox/small\u ToolBox/test\u Exe\u D2O/distrib/run\u test\u Exe\u D2O.sh这是我的错误。使用这两个参数:/Applications/MATLAB/MATLAB\u Compiler\u Runtime/v715/Users/pepe1503/Documents/Pepe/Stage\u Bruker/HS\u Conversion\u Topspin\u Bucket\u MATLAB/MATLAB/MP\u ToolBox/small\u ToolBox/D20/nmr/Agrifood\u鱼子酱\u Sturgeon\u D2O/4/pdata当我试图仅使用“bash run\u test\u Exe\u D2O.sh”时,我得到了这个错误:“bash:run_test_Exe_D2O.sh:没有这样的文件或目录”这就是为什么我必须将所有路径放在我的sh文件中
int main(int argc, const char * argv[])
{
char test_Exe[BUFSIZ];
// Build a buffer, and execute the commands within it
strcpy (test_Exe, "/Users/pepe1503/Documents/Pepe/Stage_Bruker/HS_Conversion_Topspin_Bucket_Matlab/matlab/MP_ToolBox/small_toolbox/test_Exe_D2O/distrib/run_test_Exe_D2O.sh");
strcat (test_Exe, " /Applications/MATLAB/MATLAB_Compiler_Runtime/v715 /Users/pepe1503/Documents/Pepe/Stage_Bruker/HS_Conversion_Topspin_Bucket_Matlab/matlab/MP_ToolBox/small_toolbox/D20/nmr/Agrifood_Caviar_Sturgeon_D2O/4/pdata");
printf ("Executing your Matlab program: %s\n", test_Exe);
system (test_Exe);
return 0;
}
int main(int argc, const char * argv[])
{
char* arg_list[] = {
"run_test_Exe_D2O.sh",
"/Applications/MATLAB/MATLAB_Compiler_Runtime/v715",
"/Users/pepe1503/Documents/Pepe/Stage_Bruker/HS_Conversion_Topspin_Bucket_Matlab/matlab/MP_ToolBox/small_toolbox/D20/nmr/Agrifood_Caviar_Sturgeon_D2O/4/pdata",
NULL
};
pid_t child_pid;
child_pid = fork();
if ( child_pid != 0 ) {
// This is the parent process.
return child_pid;
}
else {
// Now execute PROGRAM, searching for it in the path.
fprintf(stdout, "\n");
fprintf(stdout, "Executing your Matlab program:\n");
execvp("/Users/pepe1503/Documents/Pepe/Stage_Bruker/HS_Conversion_Topspin_Bucket_Matlab/matlab/MP_ToolBox/small_toolbox/test_Exe_D2O/distrib/run_test_Exe_D2O.sh", arg_list);
// The execvp function returns only if an error occurs.
fprintf (stderr, "an error occurred in execvp\n");
abort ();
}
return 0;
}