C- strtok函数后的分割故障


#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,它会踩在内存上。直到以后才可能是一个问题,但是一旦记忆被损坏,就完成了。

相关内容

  • 没有找到相关文章

最新更新