LINUX.ORG.RU

Sort


0

1

Здраструйте, задантие- написать програму на С, которая использует стандартые утилиты Bash(cat, grep, sort). Проблема не работает sort. Ошибка скорее всего в синтаксисе sort, но где і как правильно?

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

//#include <stream>


int main()

{

    int status;

    int fd1[2], fd2[2], fd3[2], fd4[2], fd5[2], fd6[2], fd7[2];


    pipe(fd1);    pipe(fd2);    pipe(fd3);    pipe(fd4);

    pipe(fd5);    pipe(fd6);    pipe(fd7);





    pid_t pid1 = fork();

    if (pid1!=0)

    {

                    
        char* command1[3] = {"cat", "log.txt", NULL};

        dup2(fd1[1],1);//to

        //close(pipe_fd1[1]);


        execvp (command1[0],command1);

    }


    pid_t pid2 = fork();

    if (pid2!=0)

    {

        char* command2[6]={"cut", "-f", "9,7", "-d", " ", NULL};


        dup2(fd1[0], 0);//from

        close(fd1[0]);//witout this two model

         dup2(fd2[1], 1);       

        close(fd2[1]);//ones two collums, another jnly 10


        execvp (command2[0], command2);

     }


    pid_t pid3 = fork();

    if (pid3!=0)

    {

        char* command3[4]={"/bin/grep", "404" , NULL};

        dup2(fd2[0], 0);//from

        close(fd2[0]);

        dup2(fd3[1], 1);       

        //close(fd3[1]);

        execvp (command3[0], command3);

     }

    pid_t pid4 = fork();

    if (pid4!=0)

    {

        char* command4[3]={ "sort","1" ,NULL};

        dup2(fd3[0], 0);

        //dup2(fd4[1], 1);

        execvp (command4[0], command4);//command4[0]

     }

return 0;

}


Последнее исправление: HUGO_GO (всего исправлений: 2)

либо твой преподаватель обкурился либо и то и другое.

во-первых LORCODE!

во-вторых — в Jobs!

ну и в теретих:

#include <stdlib.h>

int
main()
{
        return system("cat log.txt | cut -f 9,7 -d \" \" | grep 404 | sort");
}

вопроса же о том что же тебе таки надо от `sort' ты так и не задал.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Задание

Необходимо вывести: Топ-10 , которые вызвали ошибки клиента (код ответа начинается с 4)- /*grep ^4 не разобрался, пока проверяю как grep 404*/ + Количество посещений+ процент (к-во посищений/всего посищений*100)%

HUGO_GO
() автор топика
Ответ на: Задание от HUGO_GO

пока проверяю как grep 404*/ + Количество посещений+ процент (к-во посищений/всего посищений*100)%

Что?

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

char* command3[4]={«/bin/grep», «^4» , NULL}; не работает, решил над этим не парится char* command3[4]={«/bin/grep», «404» , NULL};- работает ну пока со следующим поработаю

HUGO_GO
() автор топика
Ответ на: Задание от HUGO_GO

нет, он явно обкурился. собери сначала работающий прототип на bash'е и только потом перекладывай его на C.

beastie ★★★★★
()
Ответ на: комментарий от HUGO_GO

в Bash использовал временные файлы, а сдесь без них нужно, и еще все должно быть в потоках. Вроде разобрался- а не получается

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

а не что в коде не так.

а что в нём так? (это мягкий намёк)

dimon555 ★★★★★
()
Ответ на: комментарий от HUGO_GO

Потому что ты хочешь что бы за тебя сделали твою работу. Но я сегодня добрый.

#include <sys/types.h>
#include <sys/wait.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
execute(char *const argv[], int out)
{
	int fd[2];

	if (!pipe(fd))
		errx(1, "pipe failed");

	switch (fork()) {
	case -1:
		errx(1, "fork failed");
		break;
	case 0:
		/* child */
		close(fd[0]);
		if (!out)
			dup2(fd[1], STDOUT_FILENO);
		close(fd[1]);
		execvp(*argv, argv);
		/* NOTREACHED */
		errx(1, "execvp failed");
		break;
	default:
		/* parent */
		close(fd[1]);
		dup2(fd[0], STDIN_FILENO);
		close(fd[0]);
		break;
	}

	return 0;
}

int
main()
{
	char *argv1[] = { "echo", "you", "are", "doing", "it", "wrong", NULL };
	char *argv2[] = { "sed", "s/wrong/right/", NULL };
	char *argv3[] = { "sed", "s/you/You/", NULL };
	char *argv4[] = { "sed", "s/$/!/", NULL };

	execute(argv1, 0);
	execute(argv2, 0);
	execute(argv3, 0);
	execute(argv4, 1);

	/* wait until all children die */
	while (wait(NULL) > 0);

	return 0;
}

дальше сам.

PS: с тебя рюмка чаю.

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

блин! маленький баг закрался:

--- pipe.c.orig Sun Nov  4 04:02:54 2012
+++ pipe.c      Sun Nov  4 04:49:54 2012
@@ -10,7 +10,7 @@
 {
        int fd[2];
 
-       if (!pipe(fd))
+       if (pipe(fd))
                errx(1, "pipe failed");
 
        switch (fork()) {

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