mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-23 02:05:57 +01:00
userland: add some random filesystem and random stuff
Some moved from C++, some moved from SO, some I just made up.
This commit is contained in:
@@ -13386,6 +13386,7 @@ Good sanity check for user mode: <<qemu-user-mode-getting-started>>
|
|||||||
*** link:userland/c/stderr.c[]
|
*** link:userland/c/stderr.c[]
|
||||||
*** File IO
|
*** File IO
|
||||||
**** link:userland/c/file_write_read.c[]
|
**** link:userland/c/file_write_read.c[]
|
||||||
|
**** link:userland/linux/open_o_tmpfile.c[]: https://stackoverflow.com/questions/4508998/what-is-an-anonymous-inode-in-linux/44388030#44388030
|
||||||
* Fun
|
* Fun
|
||||||
** link:userland/c/loop.c[]
|
** link:userland/c/loop.c[]
|
||||||
|
|
||||||
@@ -13542,6 +13543,9 @@ Programs under link:userland/cpp/[] are examples of https://en.wikipedia.org/wik
|
|||||||
** link:userland/cpp/if_constexpr.cpp[]: C++17 `if constexpr`
|
** link:userland/cpp/if_constexpr.cpp[]: C++17 `if constexpr`
|
||||||
* fstream
|
* fstream
|
||||||
** link:userland/cpp/file_write_read.cpp[]
|
** link:userland/cpp/file_write_read.cpp[]
|
||||||
|
** link:userland/cpp/temporary_directory.cpp[]: https://stackoverflow.com/questions/3379956/how-to-create-a-temporary-directory-in-c/58454949#58454949
|
||||||
|
* random
|
||||||
|
** link:userland/cpp/random.cpp[]
|
||||||
|
|
||||||
[[cpp-multithreading]]
|
[[cpp-multithreading]]
|
||||||
==== C++ multithreading
|
==== C++ multithreading
|
||||||
|
|||||||
@@ -508,6 +508,9 @@ path_properties_tuples = (
|
|||||||
'gem5_unimplemented_instruction': True,
|
'gem5_unimplemented_instruction': True,
|
||||||
},
|
},
|
||||||
'count.cpp': {'more_than_1s': True},
|
'count.cpp': {'more_than_1s': True},
|
||||||
|
# Need to pass -lstdc++fs but we don't have a mechanism
|
||||||
|
# to test the GCC version and only pass if >= 7.
|
||||||
|
'temporary_directory.cpp': {'no_build': True},
|
||||||
'sleep_for.cpp': {
|
'sleep_for.cpp': {
|
||||||
'more_than_1s': True,
|
'more_than_1s': True,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* https://cirosantilli.com/linux-kernel-module-cheat#cpp */
|
// https://cirosantilli.com/linux-kernel-module-cheat#cpp
|
||||||
|
|
||||||
#include <lkmc.h>
|
#include <lkmc.h>
|
||||||
|
|
||||||
|
|||||||
22
userland/cpp/random.cpp
Normal file
22
userland/cpp/random.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
// https://cirosantilli.com/linux-kernel-module-cheat#cpp
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
// Potentially expensive /dev/urandom read that waits for entropy.
|
||||||
|
std::random_device dev;
|
||||||
|
std::mt19937 prng(dev());
|
||||||
|
std::uniform_int_distribution<uint64_t> zero_ull_max(0);
|
||||||
|
std::uniform_int_distribution<uint8_t> one_to_six(1, 6);
|
||||||
|
|
||||||
|
unsigned long long loops = 1;
|
||||||
|
if (argc > 1) {
|
||||||
|
loops = std::stoull(argv[1], NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto i = 0U; i < loops; ++i) {
|
||||||
|
std::cout << "zero_to_ull_max 0x" << std::hex << zero_ull_max(prng) << std::endl;
|
||||||
|
std::cout << "one_to_six " << std::dec << one_to_six(prng) << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
61
userland/cpp/temporary_directory.cpp
Normal file
61
userland/cpp/temporary_directory.cpp
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
// https://cirosantilli.com/linux-kernel-module-cheat#cpp
|
||||||
|
//
|
||||||
|
// ./build disabled for now because of GCC std::filesystem mess.
|
||||||
|
// Compile manually with:
|
||||||
|
// g++-8 -std=c++17 -o temporary_directory.out temporary_directory.cpp -lstdc++fs
|
||||||
|
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
#include <exception>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <random>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
std::filesystem::path create_temporary_directory(unsigned long long max_tries = 100) {
|
||||||
|
auto tmp_dir = std::filesystem::temp_directory_path();
|
||||||
|
unsigned long long i = 0;
|
||||||
|
std::random_device dev;
|
||||||
|
std::mt19937 prng(dev());
|
||||||
|
std::uniform_int_distribution<uint64_t> rand(0);
|
||||||
|
std::filesystem::path path;
|
||||||
|
while (true) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << std::hex << rand(prng);
|
||||||
|
path = tmp_dir / ss.str();
|
||||||
|
// true if the directory was created.
|
||||||
|
if (std::filesystem::create_directory(path)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == max_tries) {
|
||||||
|
throw std::runtime_error("could not find non-existing directory");
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
std::cout << "temp_directory_path() = "
|
||||||
|
<< std::filesystem::temp_directory_path()
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
auto tmpdir = create_temporary_directory();
|
||||||
|
std::cout << "create_temporary_directory() = "
|
||||||
|
<< tmpdir
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
// Use our temporary directory.
|
||||||
|
std::ofstream ofs(tmpdir / "myfile");
|
||||||
|
ofs << "asdf\nqwer\n";
|
||||||
|
ofs.close();
|
||||||
|
|
||||||
|
// Remove the directory and its contents.
|
||||||
|
std::filesystem::remove_all(tmpdir);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
39
userland/linux/open_o_tmpfile.c
Normal file
39
userland/linux/open_o_tmpfile.c
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/* https://cirosantilli.com/linux-kernel-module-cheat#c */
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <assert.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
char buf[] = { 'a', 'b', 'c', 'd' };
|
||||||
|
char buf2[] = { 'e', 'f', 'g', 'h' };
|
||||||
|
int f, ret;
|
||||||
|
size_t off;
|
||||||
|
|
||||||
|
/* Create the temporary file and write to it. */
|
||||||
|
f = open(".", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
|
||||||
|
ret = write(f, buf, sizeof(buf));
|
||||||
|
|
||||||
|
/* Interactivelly check if anything changed on directory. It hasn't. */
|
||||||
|
/*puts("hit enter to continue");*/
|
||||||
|
/*getchar();*/
|
||||||
|
|
||||||
|
/* Read from the temporary file, and assert that
|
||||||
|
* we read the same as we wrote. */
|
||||||
|
lseek(f, 0, SEEK_SET);
|
||||||
|
off = 0;
|
||||||
|
while ((ret = read(f, buf2 + off, sizeof(buf) - off))) {
|
||||||
|
off += ret;
|
||||||
|
}
|
||||||
|
close(f);
|
||||||
|
assert(!memcmp(buf, buf2, sizeof(buf)));
|
||||||
|
|
||||||
|
/* Assert that the file is gone now that we removed it. */
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user