2
我试图给我的程序一个命令行参数,剥离第一个字符并将剩余的字符串转换为int。但是当我用if (argv[i][0] == 'w')
进行测试时,我得到了分段错误。测试字符串中的第一个字符给出分段错误
$ ./program w10
Segmentation fault
#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <argp.h>
#include <python2.7/Python.h>
/* If this flag is nonzero, don’t handle the signal right away. */
volatile sig_atomic_t signal_pending;
/* This is nonzero if a signal arrived and was not handled. */
volatile sig_atomic_t defer_signal;
void
huphandler (int signum)
{
if (defer_signal)
signal_pending = signum;
else
exit(0);
}
int
main(int argc, char **argv)
{
signal(SIGHUP, huphandler);
int i;
int wait = 0;
char *args[argc+3];
args[0] = "mypy.py";
for (i=0; i<argc; i++) {
if (argv[i][0] == 'w') { // Here's where the problem is
memmove(argv[i], argv[i]+1, strlen(argv[i]));
wait = strtol(argv[i], NULL, 10);
}
else {
args[i+1] = argv[i];
printf("%s\n", args[i+1]);
}
}
argc = i + 2;
FILE *file;
Py_SetProgramName(args[0]);
Py_Initialize();
PySys_SetArgv(argc, args);
while (true) {
defer_signal++;
file = fopen(strcat(getenv("HOME"), "/mypy.py"), "r");
PyRun_SimpleFile(file, "mypy.py");
Py_Finalize();
defer_signal--;
if (defer_signal == 0 && signal_pending != 0)
exit(0);
if (wait > 0) sleep(wait);
else exit(0);
}
}
你为什么试图将argv [i]的值改为1(并试图写出可能(几乎肯定是)只读内存)而不是仅仅增加argv [i]? –
是的,我已将它更改为'argv [i] ++;'。我只是不确定。但它仍然失败。 – user193661
发布的代码缺少声明:'#include',这是'strtol()'和'memmove()'和'strlen()'和'strcat()'函数需要的。发布的代码缺少以下语句:'exit()'和'getenv()'函数需要'#include ' –
user3629249