#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>
#include <stddef.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
bool kill_self = false;
void my_signal_handler(int signum, siginfo_t* info, void* ptr){
// register action for SIGINT (find out my pid and kill self if kill_self)
printf("Signal sent from process %lun", (unsigned long)info->si_pid);
if (kill_self){ //kill_self will surely be updated correctly?
kill(getpid(), SIGKILL); //return int - for check?
}
}
int prepare(){
struct sigaction new_action;
memset(&new_action, 0, sizeof(new_action));
new_action.sa_sigaction = my_signal_handler;
new_action.sa_flags = SA_SIGINFO;
//register handler
if (0 != sigaction(SIGINT, &new_action, NULL)){
printf("Signal handler registration %sn failed", strerror(errno));
return 1;
}
return 0;
}
int main(void)
{
if (prepare() != 0)
exit(-1);
while (1)
{
char** arglist = NULL;
char* line = NULL;
size_t size;
int count = 0;
if (getline(&line, &size, stdin) == -1) {
printf("getline failedn");
free(line);
break;
}
arglist = (char**) malloc(sizeof(char*));
if (arglist == NULL) {
printf("malloc failed: %sn", strerror(errno));
exit(-1);
}
arglist[0] = strtok(line, " tn");
while (arglist[count] != NULL) {
printf("in whilen");
++count;
arglist = (char**) realloc(arglist, sizeof(char*) * (count + 1));
if (arglist == NULL) {
printf("realloc failed: %sn", strerror(errno));
exit(-1);
}
arglist[count] = strtok(NULL, " tn");
}
//continue code...
对于行mkdir new
(仅是一个示例) - 此处显示的代码末尾的主要函数在循环中通过2,然后再比较条件(arglist[count] != NULL
)并陷入细分故障。
奇怪的是,没有其他功能,主工作正常,没有分割故障。有人有主意吗?调试无济于事...
您使用的是非初始化的变量。这会导致微妙的错误,具体取决于输入流的初始值和长度。
getline
这样的工作:
- 从流到新线直至读取字符,或者我们达到了尺寸限制
- 如果需要更多字符,则reallocate buffer,或者如果newline 返回
- 重复
因此,如果大小的初始值为0,则使用"线"的空值并获得新的缓冲区。但是,如果大小不是0,它会踩在内存上。直到以后才可能是一个问题,但是一旦记忆被损坏,就完成了。