Skip to content

Instantly share code, notes, and snippets.

@ilev4ik ilev4ik/fork_printing.cpp
Last active Aug 28, 2019

Embed
What would you like to do?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
// stdout имеет буффер, где накапливается вывод
// буффер освобождается при встрече с символом '\n', fflush(stdout)
// или его переполнении. Размер буффера определён макросом BUFSIZ (обычно 8192; implementation defined)
// fork создаёт дочерний процесс и возвращает его PID или -1 в случае неудачи. пусть всё удачно...
// fork очень дорогостоящий системный вызов, т.к. он копирует практически все данные (кроме например, таблицы открытых fd...)
// заполнить буффер stdout "hello". Нет вывода на экран
printf("hello");
// создать дочерний процесс
fork();
// здесь уже имеем 2 процесса, где у каждого свой откопированный buffer вывода (в том числе), содержащий "hello"
// для каждого из процессов очистить буффер и вывести на экран "hello\n"
printf("\n");
// upd. опечатки)))
// если fork() == -1, то выведется: "hello\n"
// иначе: "hello\nhello\n"
// при этом возможно перемежение вывода, т.к. данные в файл пишутся не синхронизировано
return 0;
}
// remove duplicates from given vector of smth
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
template <typename T>
void remove_duplicates(std::vector<T>& vec)
{
if (vec.empty()) return;
// time: O(nlogn), space O(1) -- in-place
std::sort(vec.begin(), vec.end());
std::size_t slow = 0, fast = 0;
// time: O(n), space O(1)
for (; fast < vec.size(); ++fast) {
if (vec[slow] != vec[fast]) {
slow++;
vec[slow] = vec[fast];
}
}
// time: O(n), space: O(1)
vec.erase(std::next(vec.begin(), slow + 1), vec.end());
// Итого:
// time: O(nlogn), space: O(1)
}
template <typename C>
void print_iterable(const C& cont) {
std::copy(cont.begin(), cont.end(), std::ostream_iterator<typename C::value_type>(std::cout, ", "));
}
int main() {
std::vector<int> v = {0, 1, 0, 2, 5, 5, 7, 1, 10, 123, 3, 3, 0, 1};
remove_duplicates(v);
print_iterable(v);
return 0;
}
#include <fstream>
void use_file(const char* name)
{
// использование f, при котором может быть выброшено исключение
// т.к. мб выброшено исключение, то чтение из файла посредством fopen не годится
// при выбросе исключения не будет закрыт файл. fd останется "висеть"
// лучше использовать объект std::basic_ostream, который реализует в себе идиому RAII
std::ofstream file(name);
if (file.is_open()) {
std::string line;
while (getline(file, line)) {
printf("%s\n", line.c_str());
// ... stuff that may raise an exception
// throw 1;
}
// не достигнем
file.close();
}
// при вызове деструктора освобождается буффер и закрывается файл
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.