gpt4 book ai didi

c - fork,Linux 中的 execlp

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:43 26 4
gpt4 key购买 nike

#include <unistd.h>
#include <stdio.h>


int main(int argc, char* argv[])
{

int f1[2], f2[2];
char buff;

if(pipe(f1) != -1);
printf("Pipe1 allright! \n");

if(pipe(f2) != -1);
printf("Pipe2 allright \n");



if(fork()==0)
{
close(1);
dup(f1[1]);
close(0);
execlp("ls", "ls", "-l", NULL);
}
else
{
if(fork()==0)
{
close(0);
dup(f1[0]);
close(1);
dup(f2[1]);
execlp("grep", "grep", "^d", NULL);
}
else
{
if(fork()==0)
{
close(0);
dup(f2[0]);
execlp("wc", "wc", "-l", NULL);
}
}

}

return 0;

}

我正在尝试执行 ls -l | grep ^d | wc -l 在 C 中。

我尝试了一切...

怎么了? :(

输出:Pipe1 好!,Pipe2 好!

附言。您的帖子没有太多上下文来解释代码部分;请更清楚地解释您的情况。

最佳答案

你的代码有几个问题:

if(pipe(f1) != -1);
printf("Pipe1 allright! \n");

我假设这应该是一个真正的错误检查,所以请删除 if 行中的 ;

之后运行您的程序,您会注意到 grepwc 命令仍然存在,它们不会终止。使用 ps(1) 命令进行检查。 ls 命令似乎已终止。

假设,四个进程的pid是:

  • 9000(主要)
  • 9001 (ls)
  • 9002 (grep)
  • 9003(厕所)

查看 /proc/9002/fd 您会看到,文件句柄 0 (stdin) 仍然打开以供读取:

> ll /proc/9002/fd/0
lr-x------ 1 as as 64 2011-10-22 20:10 0 -> pipe:[221916]

环顾四周,谁的这个句柄还在用

> ll /proc/*/fd/* 2>/dev/null | grep 221916

你会看到,这个管道的许多句柄是打开的:grepwc 都有两个他们打开。其他管柄也是如此。

解决方法:

dup 严格 后,您必须关闭管道句柄。看这里:

#include <unistd.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
int f1[2];
char buff;

if(pipe(f1) != -1)
printf("Pipe1 allright! \n");

int pid = fork();
if(pid==0)
{
close(1);
dup(f1[1]);

close(f1[0]);
close(f1[1]);

close(0);
execlp("ls", "ls", "-l", NULL);
}
printf("ls-pid = %d\n", pid);

int f2[2];
if(pipe(f2) != -1)
printf("Pipe2 allright \n");

pid = fork();
if(pid==0)
{
close(0);
dup(f1[0]);

close(f1[0]);
close(f1[1]);

close(1);
dup(f2[1]);

close(f2[0]);
close(f2[1]);

execlp("grep", "grep", "^d", NULL);
// system("strace grep '^d'"); exit(0);
}
printf("grep-pid = %d\n", pid);

close(f1[0]);
close(f1[1]);

pid = fork();
if(pid==0)
{
close(0);
dup(f2[0]);
close(f2[0]);
close(f2[1]);

execlp("wc", "wc", "-l", NULL);
}
printf("wc-pid = %d\n", pid);

close(f2[0]);
close(f2[1]);
}

关于c - fork,Linux 中的 execlp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7861093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com