LINUX.ORG.RU
Ответ на: комментарий от anonymous

Не нужно ведь! Если хочешь printf'ом пользоваться, mmap'ишь файл и sprintf'ишь в нужную область. Либо sprintf'ишь в буфер и пишешь его в файл.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Аксиома Лора - Все технологии, которые Эдуард считает ненужными, являются более совершенными, чем те, клоторые ему нужны.

anonymous
()
Ответ на: комментарий от anonymous

Да шо ты говоришь! То-то я на совершенно говнистых технологиях велосипежу-велосипежу, и никто даже не подскажет, как же правильно сделать надо-то!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

в твою доисторическую ось скоро завезут dprintf()

anonymous
()
Ответ на: комментарий от Eddy_Em

Эдик, учоный, ты когда свои ардуины на ц програмируешь, тоже нибось исключительно ммапом пользуешься? Весело наверное команды из гипертерминала парсить без сканф то?

anonymous
()
Ответ на: комментарий от anonymous

Весело наверное команды из гипертерминала парсить без сканф то?

Я не использую scanf, у меня в терминале обычные read/write, т.к. микроконтроллер работает в символьном режиме. Вот. Да и как ты поллинг сделаешь в scanf?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Miguel

А зачем?

Я раньше пытался сокеты программировать, мне работать с дескрипторами проще т.к. половина кода это всякие fcntl/ioctl, setsockopt, select-ы (ну ладно, тут libev) и некоторое кол-во линукс-специфичных вещей. Поэтому мне дескрипторы ближе. А FILE... никогда им не заморачивался пока не решил посмотреть как в линуксе просто и быстро закрыть все дескрипторы перед вызовом execvp. И тут наткнулся на fcloseall, но выяснил что он работает только с FILE :(

true_admin ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Для этого придумали всякие O_CLOEXEC

Я о нём знаю, проблема в том что код сторонний. Можно, конечно, переопределить open/open64...

true_admin ★★★★★
() автор топика

итак, уже вторая страница, а никто внятно не убедил, что FILE вообще имеет смысл использовать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

for(int i = 0; i < MAX_FILE; i++) close(i)

Куча лишних вызовов. На текущий день одно из самых лучших решений для линукса это парсить /proc/self/fd. Но там тоже возни хватает.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от anonymous

scanf — мегаублюдочная функция. Естественно, этим говном не пользуюсь.

printf использую (для вывода на терминал + в виде snprintf для формирования буфера к записи).

Внутри мелкоконтроллеров, ясен пень, никаких printf — это ж жуткий оверхед! Ты еще скажи, линковать с libm! Гы. Извращение-то какое. Может, еще и БПФ в софтовых double на МК считать изволишь?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от true_admin

И как это я правда не вспомнил про /proc...

А еще можно свою обертку для open/close сделать, которая будет держать список открытых файлов, тогда шустрей получится все позакрывать.

С шестой стороны, софт-то твой — тебе лучше знать, что ты там понаоткрывал.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

scanf — мегаублюдочная функция. Естественно, этим говном не пользуюсь.

Немного текстовые файлы парсишь-то как, вручную на токены разбиваешь?

printf использую (для вывода на терминал + в виде snprintf для формирования буфера к записи).

Открой для себя fprintf (и заодно open_memstream). Бывает удобнее этих ваших плясок с буферами.

Внутри мелкоконтроллеров, ясен пень, никаких printf — это ж жуткий оверхед! Ты еще скажи, линковать с libm! Гы. Извращение-то какое. Может, еще и БПФ в софтовых double на МК считать изволишь?

Это не я предложил, это у тебя голоса в голове.

anonymous
()
Ответ на: комментарий от anonymous

Немного текстовые файлы парсишь-то как, вручную на токены разбиваешь?

Как обычно: strstr, strchr, strtok. scanf тут как трупу примочка!

Открой для себя fprintf

ему нужен FILE + оно буферизует выход. Мне это нахрен не нужно.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

Подписывайтесь хоть как-то!

Вот предлагали Максу писать UA анонимусов, или хотя бы ID им какой-то присваивать на основе текущих данных (IP, ID сессии)...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Примерно чтоб почувствовать, на скорую руку набросал. Разбираем /proc/modules, вытаскиваем имя и размер, имя преобразуем в полный путь. Ни один файловый дескриптор не пострадал.

Интересно просто, как это будет выглядеть без FILE.

#include <stdio.h>
#include <stdlib.h>

static void die(const char* msg)
{
        perror(msg);
        exit(EXIT_FAILURE);
}

static void getpath(const char *modname, char *buf, size_t bufsize)
{
        char *cmdbuf = NULL;
        size_t cmdbuf_size;
        FILE *cmd = open_memstream(&cmdbuf, &cmdbuf_size);
        fprintf(cmd, "modinfo -F filename %s", modname);
        fclose(cmd);
        FILE *f = popen(cmdbuf, "r");
        size_t rv = fread(buf, 1, bufsize, f);
        if (rv > 1)
                buf[rv - 1] = '\0';
        pclose(f);
        free(cmdbuf);
}

int main()
{
        FILE *modules = fopen("/proc/modules", "r");
        if (!modules)
                die("fopen");

        while (1) {
                char *name = NULL;
                size_t size;
                int cnt = fscanf(modules, "%ms %zd %*u %*s %*s %*x %*[^\n]\n", &name, &size);
                if (cnt == EOF)
                        break;
                if (cnt != 2)
                        die("scanf");

                char path[2048];
                getpath(name, path, sizeof(path));
                printf("%s: %u\n", path, size);
                free(name);
        };

        fclose(modules);

        return EXIT_SUCCESS;
}

Вот такой вывод:

/lib/modules/3.13.0-43-generic/kernel/drivers/hid/hid-generic.ko: 12548
/lib/modules/3.13.0-43-generic/kernel/drivers/hid/hid.ko: 106605
/lib/modules/3.13.0-43-generic/kernel/drivers/ata/libahci.ko: 32825
/lib/modules/3.13.0-43-generic/kernel/drivers/net/mii.ko: 13981
anonymous
()
Ответ на: комментарий от anonymous

Я не понимаю, что делает твой код, т.к. не врубаюсь в смысле open_memstream, а также:

man getpath
Нет справочной страницы для getpath
Но смысл того, что должно в итоге получиться, понял: прочитать имена модулей с размером, к имени добавить префикс (ХЗ, откуда его брать)

Сейчас кофейка попью и сделаю.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

man getpath Нет справочной страницы для getpath

ты еще и читать не умеешь

static void getpath(const char *modname, char *buf, size_t bufsize)
anonymous
()
Ответ на: комментарий от Eddy_Em

Полный путь к модулю возвращает команда «modinfo -F filename <имя модуля>». Наверняка как-то еще можно получить, но зачем? У меня же есть popen.

anonymous
()
Ответ на: комментарий от anonymous

Наверняка как-то еще можно получить, но зачем?

Можно, modinfo же получает.

cherry_boy
()
Ответ на: комментарий от anonymous

У тебя, кстати, синтаксис неправильный. Так надо:

int cnt = fscanf(modules, "%ms %zd %*u %*s %*s %*x %*\n", &name, &size);
иначе каждый нечетный модуль усвистывает в зад.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Подобосрался маненько, не подготовился. Но ты тоже не прав, вот так должно быть:

"%ms %zd %*u %*s %*s %*x%*[^\n]"

anonymous
()
Ответ на: комментарий от Eddy_Em

Сдаюсь. Нельзя сделать mmap на файл из /proc. А раз так, то мой способ для этих целей не годится. Если же тупо читать в буфер, то придется делать всякие разные дурацкие телодвижения по перемещению содержимого буфера, чтобы не рвать строки. Нафиг.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Если бы mmap работал, было бы так:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>

static void getpath(const char *modname, char *buf, size_t bufsize){
	int filedes[2];
	char cmd[256];
	ssize_t count;
	snprintf(cmd, 255, "modinfo -F filename %s", modname);
	if(pipe(filedes) == -1)
		err(3, "pipe");
	pid_t pid = fork();
	if(pid == -1)
		err(4, "fork");
	else if (pid == 0){
		while ((dup2(filedes[1], STDOUT_FILENO) == -1) && (errno == EINTR)) {}
		close(filedes[1]);
		close(filedes[0]);
		system(cmd);
		exit(0);
	}
	while(1){
		count = read(filedes[0], buf, bufsize);
		if(count == -1){
			if(errno == EINTR)
				continue;
			else
				err(7, "read");
		}else
			break;
	}
	if(count > 1) buf[count-1] = 0;
	close(filedes[0]);
	wait(0);
}

typedef struct{
	char *data;
	size_t len;
} mmapbuf;

mmapbuf *My_mmap(char *filename){
	int fd;
	char *ptr;
	struct stat statbuf;
	if(!filename) errx(1, "No filename given!");
	if((fd = open(filename, O_RDONLY)) < 0) err(1, "open");
	if((ptr = mmap (0, 4096, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED){
//		if(errno == EOVERFLOW) printf("not supported\n");
		err(3, "mmap");
	}
	if(close(fd)) err(4, "close");
	mmapbuf *ret = malloc(sizeof(mmapbuf));
	if(!ret) err(5, "malloc");
	ret->data = ptr;
	ret->len = 4096;
	return  ret;
}

void My_munmap(mmapbuf *b){
	if(munmap(b->data, b->len))
		err(1, "unmap");
	free(b);
}


int main(){
	mmapbuf *buf = My_mmap("/proc/modules");
	char *data = buf->data;
	while(data){
		char name[256], *sz;
		size_t size, l;
		int r;
		sz = strchr(data, ' ');
		if(!sz) break;
		l = sz - data;
		if(l < 255) strncpy(name, data, l);
		else break;
		name[l] = 0;
		size = atoll(sz+1);
		printf("%s, %zd\n", name, size);
		char path[2048];
		getpath(name, path, sizeof(path));
		printf("%s: %zd\n", path, size);
		data = strchr(data, '\n');
	};
	My_munmap(buf);
	return 0;
}

Eddy_Em ☆☆☆☆☆
()

Кстати, открыл щас сорцы рандомной системной утилиты (radvd):

static int vlog(int prio, char const *format, va_list ap)
{
        ...
	vsnprintf(buff, sizeof(buff), format, ap);

	switch (log_method) {
	...
	case L_STDERR:
		current = time(NULL);
		tm = localtime(&current);
		(void)strftime(tstamp, sizeof(tstamp), LOG_TIME_FORMAT, tm);

		fprintf(stderr, «[%s] %s (%d): %s\n», tstamp, log_ident, getpid(), buff);
		fflush(stderr);
		break;
	case L_LOGFILE:
		current = time(NULL);
		tm = localtime(&current);
		(void)strftime(tstamp, sizeof(tstamp), LOG_TIME_FORMAT, tm);

		fprintf(log_file_fd, «[%s] %s (%d): %s\n», tstamp, log_ident, getpid(), buff);
		fflush(log_file_fd);
        ...
	}
	return 0;
}
При этом, если правильно помню, в pppd логирование через write() сделано.
Собственно, на мой взгляд, нет ни хрена какой-то принципиальной разницы, но для чтения/записи строковых данных чаще используется *FILE, т.к.:
а) понятнее
б) портабельнее
в) начиличие семейства функций stdio избавляет от необходимости писать свои обертки для функций; хотя, конечно, можно сваять один раз себе либу и линковать ее потом к своим проектам

cherry_boy
()
Ответ на: комментарий от cherry_boy

fflush(stderr);

ржунимагу

т.к.

только один случай есть, когда это говно оправдано (см. ниже): если у тебя нет своего велосипеда для аналога mmap на /proc/

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

ржунимагу

Ну да, куда куску из реального и вполне актуального проекта тягаться с на коленке писаными примерами анонимусов.

только один случай есть, когда это говно оправдано (см. ниже): если у тебя нет своего велосипеда для аналога mmap на /proc/

Отображение памяти на память - это сильно.
Это говно вполне оправдано в любом случае с последовательным чтением строкового (да и не строкового в общем-то тоже) файла: mmap в такой ситуации каких-либо особенных преимуществ тебе не даст, во-первых.
Во-вторых, в случае c mmap можно напороться на какое-нибудь говно с выравниванием.
В-третьих, при простых и одноразовых операциях никто обычно не заморачивается, и все используют стандартные функции stdio. Потому что mmap там попросту нафиг не нужен. Ты можешь сам в этом убедиться, посмотрев сорцы того же pppd, к примеру, или какой-нибудь другой линуксовой программы.

cherry_boy
()
Ответ на: комментарий от cherry_boy

Что мы видим - мы видим обезьяну. Во-первых обезьяна даже самая не знает когда сбрасывается буфер в его ахриненных FILE-говнах и форфан юзает fflush(stderr);

Далее мы видим, что пацан совершенно не умеет писать код, это кусок говно в котором процветает бесполезная копипаста и тонны ненужного говна.

Эта параша:

	switch (log_method) {
	...
	case L_STDERR:
		current = time(NULL);
		tm = localtime(&current);
		(void)strftime(tstamp, sizeof(tstamp), LOG_TIME_FORMAT, tm);

		fprintf(stderr, «[%s] %s (%d): %s\n», tstamp, log_ident, getpid(), buff);
		fflush(stderr);
		break;
	case L_LOGFILE:
		current = time(NULL);
		tm = localtime(&current);
		(void)strftime(tstamp, sizeof(tstamp), LOG_TIME_FORMAT, tm);

		fprintf(log_file_fd, «[%s] %s (%d): %s\n», tstamp, log_ident, getpid(), buff);
		fflush(log_file_fd);

Магичиским образом превращается в:

		current = time(NULL);
		tm = localtime(&current);
		(void)strftime(tstamp, sizeof(tstamp), LOG_TIME_FORMAT, tm);

		fprintf(log_method, «[%s] %s (%d): %s\n», tstamp, log_ident, getpid(), buff);

Собственно, на мой взгляд, нет ни хрена какой-то принципиальной разницы, но для чтения/записи строковых данных чаще используется *FILE, т.к.:

Мы уже видим одну проблему fflush(), вернее одну фичу, которая мешает пацанам.

а) понятнее

О да, о да. Это не аргумент. Это субъективное понятие. Если 95% понятна феня, то чтож ты на ней не говоришь?

б) портабельнее

Это нахрен никому не нужно, ибо под портабельностью подразумевается маздай, который а) нахрен никому, кроме недалёких адептов и прочих домохозяек не нужен.

Ах ну и да, когда маздайский говноконпелятор осилит с99? В следующем веке?

Хочешь ради говна писать говно - вперёд, но это не аргумент. Особенно для «системных утилит».

Единственная херня, где надо уметь маздай - гуйня под маздайку, но а) я не пишу гуйню под маздайку, б) никто в здравом уме это не делает, в) а кто делает, то уж точно не на сишке. г) он не сидит в девелопменте на лоре и не имеет никакого отношения к онтопику.

Аргумент говно.

начиличие семейства функций stdio избавляет от необходимости писать свои обертки для функций; хотя, конечно, можно сваять один раз себе либу и линковать ее потом к своим проектам

Какие нахрен такие обёртки? Ты же мне расскажешь.

И того мы имеем, питушок, а скорее анонимный регистрант, который жиденько серанул и настучал на меня, либо сам обслуга. В жалких попытках защить свои FILE, ваяя нерабочую херню в надежде, что ему будут отвечать только недалёкие эмулеки прочие нулёвые мрази - не смог.

Я жду ваши илитарные попытки придумать ситуации в которых FILE даст хоть какой-то профит, а пока я слышу только «ко-ко-ко удобней, ко-ко-ко портабельней, ко-ко-ко». При этом под убодней подразумевается «а я нихрена кроме fopen"а не могу», под «портабельней» подразумевается только маздайка.

Из FILE нужен только принтф и только потому, что FILE захардкорен в stdout/stderr.

Постинг заблокирован: 5.2 Оскорбление участников дискуссии

Это так мило, только вот мною обоссанный регистрант, либо его подсос никогда не осилят мне запруфцевать 5.2. А так да, пользуйся кнопкой, балаболка, ведь это единственное, что у тебя есть.

anonymous
()
Ответ на: комментарий от anonymous

Вот — работающий вариант. Вроде бы, косяков нет.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

#define BUFSZ 1024

static void getpath(const char *modname, char *buf, size_t bufsize){
	int filedes[2];
	char cmd[256];
	ssize_t count;
	snprintf(cmd, 255, "modinfo -F filename %s", modname);
	if(pipe(filedes) == -1)
		err(3, "pipe");
	pid_t pid = fork();
	if(pid == -1)
		err(4, "fork");
	else if (pid == 0){
		while ((dup2(filedes[1], STDOUT_FILENO) == -1) && (errno == EINTR)) {}
		close(filedes[1]);
		close(filedes[0]);
		system(cmd);
		exit(0);
	}
	while(1){
		count = read(filedes[0], buf, bufsize);
		if(count == -1){
			if(errno == EINTR)
				continue;
			else
				err(7, "read");
		}else
			break;
	}
	if(count > 1) buf[count-1] = 0;
	close(filedes[0]);
	wait(0);
}

int main(){
	int fd = open("/proc/modules", O_RDONLY);
	if(fd < 0) err(1, "open");
	char buf[BUFSZ+1], *end = buf;
	size_t readed, toread = BUFSZ;
	buf[BUFSZ] = 0;
	while(1){
		readed = read(fd, end, toread);
		if(readed < 1 && end == buf) break;
		end += readed;
		*end = 0;
		char *E;
#define getspace(X)  {E = strchr(X, ' '); if(!E) break; *E = 0; E++;}
		getspace(buf);
		char *name = buf, *start = E;
		if(start >= end) break;
		getspace(start);
#undef getspace
		size_t size = atoll(start);
		char path[1024];
		getpath(name, path, sizeof(path));
		printf("%s: %zd\n", path, size);
		if(E < end){
			if(start = strchr(E, '\n')) start++;
			else start = end;
		}else start = E;
		if(start < end){
			readed = end - start;
			memmove(buf, start, readed);
			end = buf + readed;
			toread = BUFSZ - readed;
		}else{
			toread = BUFSZ;
			end = buf;
		}
	}
	close(fd);
	return 0;
}

Выхлоп:

cat /proc/modules
fuse 73024 2 - Live 0xffffffffa0a14000
xt_LOG 12144 0 - Live 0xffffffffa0ae2000
xt_nat 1857 0 - Live 0xffffffffa0ade000
ipt_MASQUERADE 1754 0 - Live 0xffffffffa0ada000
nf_nat_sip 8869 0 - Live 0xffffffffa0ad4000
nf_nat_irc 1358 0 - Live 0xffffffffa0ad0000
nf_nat_ftp 1780 0 - Live 0xffffffffa0acc000
xt_mark 1133 0 - Live 0xffffffffa0ac8000
iptable_nat 2766 0 - Live 0xffffffffa0ac4000
nf_nat_ipv4 3488 1 iptable_nat, Live 0xffffffffa0ac0000
nf_nat 11055 7 xt_nat,ipt_MASQUERADE,nf_nat_sip,nf_nat_irc,nf_nat_ftp,iptable_nat,nf_nat_ipv4, Live 0xffffffffa0ab8000
nvidia 10475163 41 - Live 0xffffffffa0015000 (PO)
r8169 57282 0 - Live 0xffffffffa0000000


./a.out 
/lib/modules/3.12.0/kernel/fs/fuse/fuse.ko: 73024
/lib/modules/3.12.0/kernel/net/netfilter/xt_LOG.ko: 12144
/lib/modules/3.12.0/kernel/net/netfilter/xt_nat.ko: 1857
/lib/modules/3.12.0/kernel/net/ipv4/netfilter/ipt_MASQUERADE.ko: 1754
/lib/modules/3.12.0/kernel/net/netfilter/nf_nat_sip.ko: 8869
/lib/modules/3.12.0/kernel/net/netfilter/nf_nat_irc.ko: 1358
/lib/modules/3.12.0/kernel/net/netfilter/nf_nat_ftp.ko: 1780
/lib/modules/3.12.0/kernel/net/netfilter/xt_mark.ko: 1133
/lib/modules/3.12.0/kernel/net/ipv4/netfilter/iptable_nat.ko: 2766
/lib/modules/3.12.0/kernel/net/ipv4/netfilter/nf_nat_ipv4.ko: 3488
/lib/modules/3.12.0/kernel/net/netfilter/nf_nat.ko: 11055
/lib/modules/3.12.0/kernel/drivers/video/nvidia.ko: 10475163
/lib/modules/3.12.0/kernel/drivers/net/ethernet/realtek/r8169.ko: 57282

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cherry_boy

Ну да, куда куску из реального и вполне актуального проекта тягаться с на коленке писаными примерами анонимусов.

Какбэ мой код - илита априори. Ты говори нормально, типа «код серанувшего анонимуса говно», а то пацаны нето подумают.

И да, там fflush() нахрен не нужен и это говорит только лишь то, что а) никакой портабельности там нет, ибо \n, б) пацан сам не знает как работают FILE и просто для надёжности юзает fflush().

Отображение памяти на память - это сильно.

А ты думаешь тебе прям файлы ммапятся - нет фкеш, а когда ты юзаешь буферок в своём говнокоде, то у тебя буферок буферка(фкеша). Это тоже сильно. У всех пайпов есть буферок и его спокойно можно заммапить, собственно так же как ммапиться фкеш.

Просто /proc параша и то, что не работает mmap(), а это связанно с ублюдскими пайпами и нерабочей ммапой на пайпец.

mmap в такой ситуации каких-либо особенных преимуществ тебе не даст, во-первых.

Даст. Давай я тебе опишу вменяемое api.

void * mmapanon(uint64_t len) {}//
int set_fdbuffer(int fd, void * buf) {}//+len

void spawn(char * progname, char * args[]) {
  void * stdout_dump = mmapanon(100500);//банальный "шаредмем"
  if(!fork()) {
    set_fdbuffer(stdout, stdout_dump);//свичим ядерный буфер на свой
    //exec
  }
  //wait
  return stdout_dump;
}

С похожим api у нас бы было илитное зерокопи в тех же сокетах, а не та параша, что есть сейчас.

Темболее это даст возможность наизичах заспавнить 100500 процессов без тонн говна с пайпами.

Во-вторых, в случае c mmap можно напороться на какое-нибудь говно с выравниванием.

Зачем ты пишешь о том, в чем нихрена не шаришь? Какое нахрен такое говно с выравниванием, осилишь примерчик?

В-третьих, при простых и одноразовых операциях никто обычно не заморачивается, и все используют стандартные функции stdio.

Мне насрать на то, что там и у кого «Обычно». Именно по этой причине 99% не могут в бинарь, ибо нулёвые обезьяны, которые пишут на libc, glib, а не на си.

Потому что mmap там попросту нафиг не нужен.

Нужен, просто пацаны его не умеют. По мнению балаболов и бинарь не нужен, только вот причина не в «нафигненужен», а в «я боюсь его, ибо не могу».

Ты можешь сам в этом убедиться, посмотрев сорцы того же pppd, к примеру, или какой-нибудь другой линуксовой программы.

И что мне это даст? Вон пацаны с портежем тоже не заморачивались, а теперь тонут в тоннах говна и у меня всё адски тормазит.

Вы реально настолько тупые, что не понимаете - если пацан пишет говно в одном месте - он напишет его во всех. Не бывает у рандомного ваятеля так, что он может в одном месте «не заморочиться», а в другом «заморочиться».

И я вижу эти килобайты когда там, где это можно сделать сотней строк. Эту лапшу, это говно. Это убожество в api, которое я вижу в той же libc.

anonymous
()
Ответ на: комментарий от Eddy_Em

О божечки, о божечки. Я конечно знал, что ты на головку, но это:

static void getpath(const char *modname, char *buf, size_t bufsize){
	int filedes[2];
	char cmd[256];
	ssize_t count;
	snprintf(cmd, 255, "modinfo -F filename %s", modname);
	if(pipe(filedes) == -1)//100пайп не сработает.
		err(3, "pipe");
	pid_t pid = fork();//фокр, запомним.
	if(pid == -1)
		err(4, "fork");
	else if (pid == 0){
		while ((dup2(filedes[1], STDOUT_FILENO) == -1) && (errno == EINTR)) {}//это вообще гениально.
		close(filedes[1]);//гениальные клосы.
		close(filedes[0]);
		system(cmd);//Гений нахрен, просто гений. man system не прочитался? Зачем ты юзаешь систем в форке, когда он и так форкает? Гениально.
		exit(0);
	}
	while(1){
		count = read(filedes[0], buf, bufsize);
		if(count == -1){
			if(errno == EINTR)//100% сработает.
				continue;
			else
				err(7, "read");
		}else
			break;
	}
	if(count > 1) buf[count-1] = 0;
	close(filedes[0]);//фдешки нихрена не текут.
	wait(0);//и нахрен ты его сюда впихнул?
}

int main(){
	int fd = open("/proc/modules", O_RDONLY);
	if(fd < 0) err(1, "open");
	char buf[BUFSZ+1], *end = buf;//PIPE_BUF не осилился.
	size_t readed, toread = BUFSZ;
	buf[BUFSZ] = 0;
	while(1){//от этой параши тянет только блювать.
		readed = read(fd, end, toread);
		if(readed < 1 && end == buf) break;
		end += readed;
		*end = 0;
		char *E;
#define getspace(X)  {E = strchr(X, ' '); if(!E) break; *E = 0; E++;}//макросмастер захреначит макрос там, где он юзается 2-й раз.
		getspace(buf);
		char *name = buf, *start = E;
		if(start >= end) break;
		getspace(start);//гений, нахрен ты это сюда впихнул?
#undef getspace
		size_t size = atoll(start);//он сам умеет останавливаться на спейсе.
		char path[1024];
		getpath(name, path, sizeof(path));
		printf("%s: %zd\n", path, size);
		if(E < end){//эти гениальные ифы
			if(start = strchr(E, '\n')) start++;
			else start = end;
		}else start = E;
		if(start < end){ //просто смог.
			readed = end - start;
			memmove(buf, start, readed);
			end = buf + readed;
			toread = BUFSZ - readed;
		}else{
			toread = BUFSZ;
			end = buf;
		}
	}
	close(fd);//полезно
	return 0;//ващеахриненно.
}

С этой сотней брейков и ифов у меня такое ощущение, что ты примитивный кодоген студента 1-го курса. Мозгов не хватает сразу высрать цикл, поэтому как кодоген - по независимым кусочкам.

А судя по тому как ты лепишь всякую херню, аля систем в форке - ты вообще нихрен в этом мире не понимаешь.

И да, ты обосрался. Твоя портянка в сотни раз говяней и в 2раза длиньше его. Нахрен ты её высрал - ты только доказал, что он прав. Просто гений.

anonymous
()

Царек, ты на свою портянку взгляни. Вот уж где сплошные дыры. А fork() здесь нужен: иначе как stdout из system забрать?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ну давай, питушок, я тебе популярно объяснил почему твоя портянка говно.

У нас имеется тормазное говно вместо кода, текущие дфешки и прочее говно, аля форки форфан.

Вот уж где сплошные дыры.

Давай, ты мне покажешь там хоть одну дыру, я тебя в очередной раз смешаю с говнецом и ты о5 убежишь.

Давай, показывай мне все дыры. Или ты только балаболить можешь?

А fork() здесь нужен

exec() не осилился? Если уж ты юзаешь систем из либц, то уж проще юзать popen().

Ты так и не ответил на самое важное - пацан говорил, что без FILE твой код будет адским месивом говнаикишок, что ты собственно продемонстрировал. Зачем ты высрал свою говнопортянку? Чтобы продемонстрировать свою никчёмность и его правоту? Собственно он на это и рассчитывал - ты это сделал, молодец.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.