分段故障(内核转储)C linux

分段故障(内核转储)C linux,c,linux,C,Linux,因此,我必须制作一个程序,使其执行结果与在linux中使用who和who am命令后的结果相似。问题是ifstrcmp中的两个函数。。。除此之外。。。他们分开时正在工作 主要的问题是,我必须将它们都放在一个文件中,但这样做行不通。当放在一起时,只有这样做。/程序是我,和。/程序告诉分割错误核心转储 第二个问题是,我不知道如何制作部件。/程序我工作正常吗?它应该只返回我:用户pts/0日期时间。。。并非所有的用户都像其他用户一样。。。部分 #include <stdio.h> #

因此,我必须制作一个程序,使其执行结果与在linux中使用who和who am命令后的结果相似。问题是ifstrcmp中的两个函数。。。除此之外。。。他们分开时正在工作

主要的问题是,我必须将它们都放在一个文件中,但这样做行不通。当放在一起时,只有这样做。/程序是我,和。/程序告诉分割错误核心转储

第二个问题是,我不知道如何制作部件。/程序我工作正常吗?它应该只返回我:用户pts/0日期时间。。。并非所有的用户都像其他用户一样。。。部分

#include    <stdio.h>
#include    <utmp.h>
#include    <fcntl.h>
#include    <unistd.h>
#include    <stdlib.h>
#include    <time.h>
#include    <string.h>
#include    <sys/types.h>

#define SHOWHOST

void show_info_who( struct utmp *utbufp )
{
    if(utbufp->ut_type > 4){
        time_t czas = utbufp->ut_time;
        char buf[80];
        struct tm* timeinfo = localtime(&czas);

        printf("%-8.8s", utbufp->ut_name);  
        printf(" ");                
        printf("%-8.8s", utbufp->ut_line);  
        printf(" ");                
        strftime(buf, 80, "%F %R" , timeinfo);
        printf("%s", buf);
        printf(" ");                


    #ifdef  SHOWHOST
        printf("(%s)", utbufp->ut_host);    
    #endif
        printf("\n");               
    }
}


int main(int argc, char *argv[])
{
    struct utmp current_record;
    int     utmpfd;     
    int     reclen = sizeof(current_record);

    if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
        perror( UTMP_FILE );
        exit(1);
    }

    if(strcmp ( argv[1], "am") == 0){
        if(strcmp ( argv[2], "i") == 0){
            while ( read(utmpfd, &current_record, reclen) == reclen )
                show_info_who(&current_record);
                printf("test\n");
        }

    close(utmpfd);
    return 0;
    }

        while ( read(utmpfd, &current_record, reclen) == reclen )
            show_info_who(&current_record);
        close(utmpfd);

        return 0;


}

你为什么不试试

void setutent(void); // for rewinding
struct utmp *getutent(void);
不建议直接打开和查找utmp文件。
utmp文件似乎是可以自由访问的普通文件,但其行为类似于数据库。

您是否尝试使用调试器缩小分段错误发生的范围?崩溃发生在哪里?在调试器中运行以捕获崩溃,当捕获时,您可以检查并向上遍历函数调用堆栈,向上遍历代码,还可以检查变量的值。至少请编辑您的问题,以显示崩溃发生在代码中的何处,以及相关变量的值。您似乎跳过了argc的检查,显然您调用的程序参数太少。需要Mor信息。是否有人可以在SO网站上添加一项功能,以便标题中出现分段错误的问题得到自动回答,例如使用调试器等。为您的操作系统找到Valgrind,使用完整的调试代码编译源代码,然后使用Valgrind yourProgramName运行它。Valgrind将告诉您它在哪里发现分配错误、未初始化变量、内存溢出等等。