使用共享库

时间:2017-03-28 11:04:39

标签: c linux

必须使用共享库编写一个程序,显示所有已记录用户的列表(如果使用-i或-g,则为其ID和组)。共享库中的函数正常工作,但似乎函数指针导致分段错误。因为它是学校的一个分配,我必须使用C,函数必须不返回任何内容,只取用户名。我很熟悉linux中的编程(显然)。

主要代码:

#include <unistd.h>
#include <stdlib.h>
#include <utmp.h>
#include <dlfcn.h>

struct utmp *p;

int main(int argc, char* argv[]){


int opt, iflag = 0; 
int gflag = 0;
void *handle;



while((opt = getopt(argc, argv, "ig")) != -1)
{
    switch(opt)
    {
        case 'i':
            iflag = 1;
            break;
        case 'g':
            gflag = 1;
            break;
        default:
        fprintf(stderr, "Błąd \n");
        exit(EXIT_FAILURE);
    }
}   

handle = dlopen("./zad2lib.so", RTLD_LAZY);

if (handle == NULL) {
    fprintf(stderr, "Unable to open library: %s\n", dlerror());
    iflag = 0;
    gflag = 0; 
}
while ((p = getutent()) != NULL)    {
    if (p->ut_type == USER_PROCESS)
    {
        if (iflag == 1) {
            dlerror();
             void (*func)(char*) = (void(*)())dlsym(handle, "userID");
            func(p->ut_user);

        } 
            printf("%s ", p->ut_user);

        if (gflag == 1) {
            dlerror();  
            void (*func)(char*) = (void(*)())dlsym(handle, "userGroups"); 
            func(p->ut_user);
            }
        }           
        printf("\n");   
    }
    dlclose(handle);
}
return 0;
}

.so文件:

#include <sys/types.h>
#include <grp.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>

void userID(char *name) {
    struct passwd *pw = getpwnam(name);
    printf("%d ", pw->pw_uid);
}

void userGroups(char *name) {

    struct passwd *pw = getpwnam(name);
    int i;
    int gidsize = 100;
    struct group* g;
    gid_t *grouplist = malloc(gidsize*sizeof(gid_t));
    getgrouplist(name, pw->pw_gid, grouplist, &gidsize);
    printf("[");
    for (i = 0; i < gidsize; i++)   {
        g = getgrgid(grouplist[i]);
        printf(" %s", g->gr_name); 
    }
    printf(" ]");
    free(grouplist);
}

0 个答案:

没有答案