LINUX.ORG.RU

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

 , ,


0

1

Добрый день, не понимаю как правильно должен работать конвейер если больше 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);
}


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

Опиши задание более конкретно. Тебе надо ls | cat -e | wc или тебе надо чтоб вывод ls раздваивался и поступал в cat -e и wc одновременно, а не по цепочке?

SZT ★★★★★ ()

Если надо раздвоить, посмотри man 2 tee и man 2 writev.

SZT ★★★★★ ()

Зачем вы перед

pid3 = fork();
делаете
close(t[0]);
close(t[1]);

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

Можешь еще с циклом помочь пожалуйста? Результат неправильный выдает и с waitpid тоже косяк

int main(int ac, char **av, char **env)
{
	char *argv[4][3];
	pid_t pid;
	int p[2];
	int t[2];
	int status;
	int i = 0;

	argv[0][0] = "/bin/ls";
	argv[0][1] = "-la";
    argv[0][2] = 0;

    argv[1][0] = "/bin/cat";
    argv[1][1] = "-e";
    argv[1][2] = 0;

    argv[2][0] = "/usr/bin/wc";
    argv[2][1] = 0;
    argv[2][2] = 0;

    argv[3][0] = "/bin/cat";
    argv[3][1] = "-en";
    argv[3][2] = 0;

    pipe(p);
    pipe(t);
    while (i < 4)
    {
    	pid = fork();
    	if (i == 0)
    	{
    		if (pid == 0)
    		{
    			dup2(p[1], 1);
    		    close(p[0]);
    		    close(p[1]);
    		    execve(argv[i][0], argv[i], env);
    		    exit(0);
    		}
    		else if (pid == -1)
    		{
    			printf("ERROR%d\n", i);
    			exit(1);
    		}
    		else
    		{
    			close(p[1]);
    		}
    	}
    	else if (i >= 1 && i < 3)
    	{
    		if (pid == 0)
    		{
    			if ((i % 2) == 0)
    			{
                    dup2(p[0], 0);
    			    close(p[0]);
    			    dup2(t[1], 1);
					close(t[0]);
					close(t[1]);
                    pipe(p);
                }
                else
                {
                    dup2(t[0], 0);
                    close(t[0]);
                    dup2(p[1], 1);
                    close(p[0]);
					close(p[1]);
					pipe(t);
                }
    		    execve(argv[i][0], argv[i], env);
    		    exit(0);
    		}
    		else if (pid == -1)
    		{
    			printf("ERROR%d\n", i);
    			exit(1);
    		}
    		else
    		{
    			if ((i % 2) == 0)
    			{
    				close(p[0]);
    				close(t[1]);
    			}
    			else
    			{
    				close(t[0]);
    				close(p[1]);
    			}
    		}
    	}
    	else if (i == 3)
    	{
    		if (pid == 0)
    		{
    			dup2(p[0], 0);
    		    close(p[0]);
    		    execve(argv[i][0], argv[i], env);
    		    exit(0);
    		}
    		else if (pid == -1)
    		{
    			printf("ERROR%d\n", i);
    			exit(1);
    		}
    	}
    	i++;
    }
    while (waitpid(-1, &status, 0) > 0)
		;
    return (0);
}

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