LINUX.ORG.RU

Сообщения diosio

 

Django запрос в annotate

Форум — Web-development

Добрый день, появилась необходимость добавить поле на вывод get запроса

    def annotate_poll_name(self, obj):
        steps = Step.objects.filter(block=obj).annotate(
            poll_text=Poll.objects.get(id=447).text
        )
        return StepSerializer(steps, many=True).data
id пока что указан руками просто для тестов, в дальнейшем там должно передаваться поле Step.object_id, проблема в том что даже в таком варианте все валится и я не могу понять почему, помогите пожалуйста TypeError: QuerySet.annotate() received non-expression(s):

 ,

diosio
()

Проблема с шифтом

Форум — Linux-install

Добрый вечер, после переустановки винды и убунту левый шифт стал печатать «ч» а правый «ц» при том такая проблема и на винде и на убунту, в интернете ничего кроме советов убрать машинный язык не нашел, хелп плз

 ,

diosio
()

ERROR SUMMARY in valgrind

Форум — Development

Добрый день, хотел узнать как сегнуть проект из за ERROR SUMMARY на маке, на линуксе я делал инъекцию подменяя маллок на свой, но на маке почему то так не работает

export LD_PRELOAD=pwd/libhackmalloc.so

Подскажите пожалуйста как это сделать на маке

 ,

diosio
()

как присвоить ребенку новую группу процесса?

Форум — Development

Добрый вечер, не могу разобраться как пользоваться setpgid мне нужно присвоить новому процессу группу отличную от родителя, чтобы при нажатии cntl+Z вставал на паузу только процесс вызванный с помощью execve а мой псевдо bash продолжал работу. Помогите пожалуйста разобраться

void	ft_infinit_pipe2(t_exectoken *head, t_memory *q)
{
	int			p[2];
	pid_t		pid;
	int			fd_in;
	char		*rt;
	int			status;

	fd_in = 0;
	ft_file_create(head);
	rt = NULL;
	while (head)
	{
		if (pipe(p) == -1 || (pid = fork()) == -1)
		{
			ft_putstr_fd("ERROR pipe or fork", 2);
			exit(1);
		}
		else if (pid == 0)
		{
			if (head->left != NULL)
			{
				dup2(p[1], 1);
				close(p[1]);
			}
			if (head->file_opt)
				ft_fd_flag(head->file_opt, &fd_in);
			dup2(fd_in, 0);
			close(p[0]);
			if (ft_whatis2(head, q) == 0)
			{
				exit(0);
			}
			else
				rt = hash_get(head->file_args[0], 0);
			if (rt != NULL)
				ft_start_exe(rt, head->file_args, pid);
			exit(0);
		}
		else
		{
			g_pid = pid;
//			setpgid(g_pid, getpgid(g_pid) + 100);
			signal(SIGINT, ft_fork_signal);
//			signal(SIGSTOP, SIG_IGN);/////?????
//			signal(SIGTSTP, ft_fork_signal);////cntrl+Z
//			printf("%spid: %d%s\n", RED, pid, RESET);
			if (g_pid != -1)
				waitpid(pid, &status, 0);
//			printf("%sstatus: %d%s\n", RED, status, RESET);
			if (WIFEXITED(status))
			{
				g_exit_code = WEXITSTATUS(status);
				if (rt == NULL)
					g_exit_code = 127;
//				printf("%sExit status of the child was %d%s\n", YEL, g_exit_code, RESET);
			}
			close(p[1]);
			fd_in = p[0];
			head = (head)->left;
		}
	}
}

 , ,

diosio
()

Проблема с записью в pipe

Форум — Development

Добрый вечер, не могу понять как правильно реализовать «<<» Например при вызове «cat << aa» heredoc вроде нормально срабатывает и в pipe записывает все но кот не завершает работу и его даже никак не убить. Запись в пайп идет при флаге = 4 https://github.com/Quickaxe-Martina/beta21sh вот весь проект на всякий случай

 int 	ft_fd_flag(char **av, int *fd_in, int *p0, int *p1)
{
	int flag = 0;
	int i = -1;
	int st = 1;
	int fd;
	int b = 0;
	int f[2];
	char *str;//////////
	int j;/////////

	while (av[++i])
	{
		if (b == 0 && av[i][0] >= '0' && av[i][0] <= '9')
		{
			st = ft_atoi(av[i]);
		}
		else if ((av[i][0] == '>' || av[i][0] == '<' || av[i][0] == '&'))
		{
			ft_strcmp(av[i], ">") == 0 ? flag = 1 : flag;//Направить стандартный поток вывода в файл. Если файл не существует, он будет создан; если существует — перезаписан сверху.
			ft_strcmp(av[i], ">>") == 0 ? flag = 2 : flag;//Направить стандартный поток вывода в файл. Если файл не существует, он будет создан; если существует — данные будут дописаны к нему в конец.
			ft_strcmp(av[i], "<") == 0 ? flag = 3 : flag;//Использовать файл как источник данных для стандартного потока ввода.
			ft_strcmp(av[i], "<<") == 0 ? flag = 4 : flag;//Весь текст между блоками EOF (в общем случае вместо EOF можно использовать любое слово) будет выведен на экран. Важно: перед последним EOF не должно быть пробелов! (heredoc синтаксис).
			ft_strcmp(av[i], ">&-") == 0 ? flag = 5 : flag;//Закрыть поток вывода перед вызовом команды
			ft_strcmp(av[i], ">&") == 0 ? flag = 6 : flag;//Направить стандартный поток вывода и стандартный поток ошибок в файл. Другая форма записи: >файл 2>&1.
			ft_strcmp(av[i], "&>") == 0 ? flag = 6 : flag;
			b = 1;
		}
		else if (b == 1 && flag != 0)
		{
			if (flag == 1 || flag == 6)
				fd = open(av[i], O_CREAT | O_RDWR | O_TRUNC,
						S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);//добавить ошибки
			else if (flag == 2)
				fd = open(av[i], O_CREAT | O_RDWR | O_APPEND,
						S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
			else if (flag == 3)
				*fd_in = open(av[i], O_RDONLY);
			if (flag == 1 || flag == 2)
			{
				dup2(fd, st);
				close(fd);
			}
			else if (flag == 6)
			{
				dup2(fd, 1);
				dup2(fd, 2);
				close(fd);
			}
			else if (flag == 5)///////////
			{
				pipe(f);
				*p0 = f[0];
				*p1 = f[1];
				;
			}
			else if (flag == 4)
			{
				pipe(f);
				str = ft_strnew(1);
				set_input_mode();
				while (ft_strcmp(str, av[i]) != 0)
				{
					j = -1;
					while(str[++j])
						write(f[1], &str[j], 1);
					write(f[1], "\n", 1);
					free(str);
					str = ft_read_8(ft_main_norm(2), NULL, 2);//FIX IT
					write(2, "\n", 1);
				}
				ft_putchar_fd(EOF, f[1]);
				reset_input_mode();
				*fd_in = f[0];
			}
			b = 0;
			flag = 0;
			st = 1;
		}
	}
	return (fd);
}

void    ft_infinit_pipe(t_exectoken *head)
{
	int		p[2];
	pid_t	pid;
	int		fd_in = 0;
	int		fd;

	while (head)
	{
		pipe(p);
		if ((pid = fork()) == -1)
		{
			exit(1);
		}
		else if (pid == 0)
		{
			if (head->left != NULL)///////////////////////////////
			{
				dup2(p[1], 1);
				close(p[1]);
			}
			if (head->file_opt)
				fd = ft_fd_flag(head->file_opt, &fd_in, &p[0], &p[1]);
			dup2(fd_in, 0);
			close(p[0]);
			if (ft_path_fork(head->file_args, pid) == -1)
			{
				ft_putstr_fd("21sh: command not found: ", 2);
				ft_putendl_fd(&(head->file_args[0][1]), 2);
			}
			exit(0);
		}
		else
		{
			wait(NULL);
			close(p[1]);
			fd_in = p[0];
			head = head->left;
		}
	}
}

 ,

diosio
()

Как объединить 2 потока

Форум — Development

Добрый день, «ls | cat -en | wc < test» как я понимаю программа должна объединить данные из pipe и файла и передать их уже на ввод в wc, но я не понимаю как это сделать. Помогите пожалуйста

 , , ,

diosio
()

Реализация конвейра

Форум — Development

Добрый день, не понимаю как правильно должен работать конвейер если больше 2 аргументов, а точнее как заставить новую функцию читать из старого pipe. wc ругается что нет ничего на входе. P.S. Потом буду это все в цикл переделывать, но пока что пытаюсь понять как это должно работать.

 
int main(int ac, char **av, char **env)
{
    // int fw=open("chinaisbetter.txt", O_APPEND|O_WRONLY);
    char *argv[2];
    char *argv2[3];
    char *argv3[2];
    pid_t   pid;
    pid_t   pid2;
    pid_t   pid3;
    int p[2];
    int t[2];
    int status;
    argv[0] = "ls";
    argv[1] = 0;
    argv2[0] = "cat";
    argv2[1] = "-e";
    argv2[2] = 0;
    argv3[0] = "wc";
    argv3[1] = 0;

    pipe(p);
    pid = fork();
    // printf("pid = %d\n", pid);
    if (pid == 0)
    {
        dup2(p[1], 1);
        close(p[0]);
        close(p[1]);
        execve("/bin/ls", argv, env);
        exit(0);
        close(p[1]);
    }
    else if (pid == -1)
    {
        printf("ERROR1\n");
        exit(1);
    }
    else
        close(p[1]);
    pipe(t);
    pid2 = fork();
    // printf("pid2 = %d\n", pid2);
    if (pid2 == 0)
    {
        dup2(p[0], 0);
        dup2(t[1], 1);
        close(p[0]);
        close(p[1]);
        close(t[0]);
        close(t[1]);
        execve("/bin/cat", argv2, env);
        exit(0);
    }
    else if (pid2 == -1)
    {
        printf("ERROR2\n");
        exit(1);
    }
    else
    {
        close(p[0]);
        close(t[0]);
        close(t[1]);
    }
    pid3 = fork();
    printf("*pid3 = %d*\n", pid3);
    if (pid3 == 0)
    {
        dup2(t[0], 0);
        close(t[0]);
        execve("/usr/bin/wc", argv3, env);
        exit(0);
    }
    else if (pid3 == -1)
    {
        printf("ERROR3\n");
        exit(1);
    }
    waitpid(-1, &status, 0);
    waitpid(-1, &status, 0);
    waitpid(-1, &status, 0);
    printf("end\n");
    return (0);
}

 , ,

diosio
()

правильная работа SIGTSTP

Форум — Development

Добрый вечер, не понимаю как приостановить новый процесс. SIGINT нормально работает и завершает процесс и возвращает в мою программу, а SIGTSTP срабатывает но возврата в мою программу нет, никакой реакции пока не нажму ^C. подскажите пожалуйста как правильно реализовать?

 void	ft_fun_fork(char *path, char **arg) /*функция создания нового процесса*/
{
	pid_t	pid;

	pid = fork();
	signal(SIGINT, ft_fork_signal);
	signal(SIGTSTP, ft_fork_signal);
	if (pid == 0)
		execve(path, arg, g_env);
	else if (pid < 0)
	{
		free(path);
		ft_putendl("Fork failed to create a new process.");
		return ;
	}
	wait(&pid);
	if (path)
		free(path);
}

void	ft_fork_signal(int signo)
{

	if (signo == SIGINT)
	{
		ft_putstr("\n");
		signal(SIGINT, ft_fork_signal);
		// exit(EXIT_SUCCESS);
	}
	else if (signo == SIGTSTP)
	{
		// kill(getpid(), SIGTSTP);
		ft_putstr("\n");
		// signal(SIGTSTP, ft_fork_signal);
		signal(SIGSTOP, SIG_DFL);
	}
}

 ,

diosio
()

Пехерват сигналов

Форум — Development

Добрый день, все еще пишу на си реализацию терминала. И столкнулся с проблемой реализации вырезать/копировать/вставить. дело в том что на ^Y(вставить) программа завершает работу, а функцией signal у меня не получается перехватить. Подскажите пожалуйста как это можно сделать + как ловить другие сигналы ^+U ^+W esc+W?

 ,

diosio
()

не работает tputs

Форум — Development

Добрый день, пытаюсь написать реализацию терминала. Хочу чтобы при вызове от переводил терминал в неканонический режим и очищал экран. Но tputs почему то не срабатывает, помогите пожалуйста.

struct termios saved_attributes; /* переменная для сохранения исходных атрибутов терминала */
 
int ft_c(int c)
{
    write(2, &c, 1);
    return (1);
}
 
void    reset_input_mode(void)
{
    tcsetattr(0, TCSANOW, &saved_attributes);
}
 
void set_input_mode(void)
{
    struct termios tattr;
 
    if (!isatty(0)) /* проверяем, что вводим с терминала */
    {
        fprintf(stderr, "Not a terminal.\n");
        exit (1);
    }
    tcgetattr(0, &saved_attributes); /* считываем текущий режим работы терминала */
    memcpy(&tattr, &saved_attributes, sizeof(tattr));
    tattr.c_lflag &= ~(ICANON | ECHO | ECHOE); /* включаем неканонический режим без эха */
    tattr.c_cc[VMIN] = 1; /* считываем минимум по одному символу */
    tattr.c_cc[VTIME] = 0; /* без ограничения времени ожидания */
    tcsetattr(0, 0, &tattr); /* устанавливаем новый режим работы терминала */
    tputs(tgetstr("cl", NULL), 1, ft_c);
}

 

diosio
()

RSS подписка на новые темы