Can I use strtok() in a Linux Kernel Module?

2020-02-11 05:04发布

问题:

I need to do a parse on the data written to my module, and the use of the strtok() function of string.h would be useful. However I've tried

#include <string.h>

and

#include <linux/string.h>

with no success. Is this possible? Or will I have to write my own strtok function?

Thanks

回答1:

There is no strtok in the valid Linux Kernel API. You will have to write your own. See the section String Manipulation in the Linux Kernel API.

BTW, I would suggest staying away from strtok (or anything strtok-like). It's not reentrant and is unsafe in kernel code (which is inherently multithreaded).

If you're going to duplicate the function, consider duplicating strtok_r.



回答2:

The latest kernel library has this, which may do what you need:

/**
 * strsep - Split a string into tokens
 * @s: The string to be searched
 * @ct: The characters to search for
 *
 * strsep() updates @s to point after the token, ready for the next call.
 *
 * It returns empty tokens, too, behaving exactly like the libc function
 * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
 * Same semantics, slimmer shape. ;)
 */


回答3:

char *strsep(char **s, const char *ct)

would be the function that you are looking for.
You can look it up in lxr, source/lib/string.c, line 589 (for version/release 4.6)