Linux下的C语言#getline和getdelim


=Start=

缘由:

整理学习在进行Linux下C编程中碰到的一些知识点,方便以后进行参考。

正文:

参考解答:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
   FILE *stream;
   char *line = NULL;
   size_t len = 0;
   ssize_t nread;
   if (argc != 2) {
       fprintf(stderr, "Usage: %s <file>\n", argv[1]);
       exit(EXIT_FAILURE);
   }
   stream = fopen(argv[1], "r");
   if (stream == NULL) {
       perror("fopen");
       exit(EXIT_FAILURE);
   }
   while ((nread = getline(&line, &len, stream)) != -1) {
       printf("Retrieved line of length %zu:\n", nread);
       // fwrite(line, nread, 1, stdout);
       printf("strlen(line) = %d\n", strlen(line));
       printf("sizeof(line) = %d\n", sizeof(line));
       printf("%s\n", line);
   }
   printf("strlen(line) = %d\n", strlen(line));
   printf("sizeof(line) = %d\n", sizeof(line));
   printf("%s\n", line);
   free(line);
   fclose(stream);
   exit(EXIT_SUCCESS);
}

&

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
    FILE *cmdline = fopen("/proc/self/cmdline""rb");
    char *arg = 0;
    size_t size = 0;
    while(getdelim(&arg, &size, 0, cmdline) != -1)
    {
        puts(arg);
    }
    free(arg);
    fclose(cmdline);
    return 0;
}

&

void read_proc(int process_pid) {
    char cmdline[1024], fname1[1024], ids[1024], fname2[1024], buf[1024];
    int r = 0, fd, i;
    FILE *f = NULL;
    snprintf(fname1, sizeof(fname1), "/proc/%d/status", process_pid);
    f = fopen(fname1, "r");
    memset(&ids, 0, sizeof(ids));
    while (f && fgets(buf, sizeof(buf), f) != NULL) {
        if (strstr(buf, "Uid")) {
            strtok(buf, "\n");
            snprintf(ids, sizeof(ids), "%s", buf);
        }
    }
    if (f)
        fclose(f);
    snprintf(fname2, sizeof(fname2), "/proc/%d/cmdline", process_pid);
    fd = open(fname2, O_RDONLY);
    memset(&cmdline, 0, sizeof(cmdline));
    if (fd > 0) {
        r = read(fd, cmdline, sizeof(cmdline));
        close(fd);
        for (i = 0; r > 0 && i < r-1; ++i) {
            if (cmdline[i] == 0)
                cmdline[i] = ' ';
        }
    }
    printf("EXEC:pid=%d\t[%s]\t[%s]\n", process_pid, ids, cmdline);
}
参考链接:

=END=

, ,

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注