如何通过管道()从子进程(exec)与父进程进行通信?
How to communicate from children process(exec) with parent through pipe()?
我有这两个文件,我使用 exec() 从 main.c 调用 exec.c。据我了解 exec.c 应该继承管道,但它说 exec.c 中没有 link 管道。这里有什么问题?
main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define die(e) \
do \
{ \
fprintf(stderr, "%s\n", e); \
exit(EXIT_FAILURE); \
} while (0);
int main(int argc, char *argv[])
{
int link[2];
pid_t pid;
char foo[4096];
if (pipe(link) == -1)
die("pipe");
if ((pid = fork()) == -1)
die("fork");
if (pid == 0)
{
dup2(link[1], STDOUT_FILENO);
close(link[0]);
close(link[1]);
execvp("./exec", argv);
die("execl");
}
else
{
close(link[1]);
int nbytes = read(link[0], foo, sizeof(foo));
printf("Output: (%.*s)\n", nbytes, foo);
wait(NULL);
}
return 0;
}
exec.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
int main(int argc, char *argv[])
{
char a;
a='A';
write(link[1],&a,sizeof(a));
return 0;
}
我只是在练习,想输出从 pipe() 保存的数据
我做错了什么,你能帮我调试一下吗?
TIA!
在 main.c
程序中,您通过子进程的标准输出连接管道。
这意味着子进程通过其正常的标准输出将信息传递给父进程。
由此可见,exec.c
程序可以像这样简单:
#include <stdio.h>
int main(void)
{
printf("A");
}
更具体地说,您的 exec.c
源文件不知道管道,绝对不知道变量 link
,并且将无法构建。
我有这两个文件,我使用 exec() 从 main.c 调用 exec.c。据我了解 exec.c 应该继承管道,但它说 exec.c 中没有 link 管道。这里有什么问题?
main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define die(e) \
do \
{ \
fprintf(stderr, "%s\n", e); \
exit(EXIT_FAILURE); \
} while (0);
int main(int argc, char *argv[])
{
int link[2];
pid_t pid;
char foo[4096];
if (pipe(link) == -1)
die("pipe");
if ((pid = fork()) == -1)
die("fork");
if (pid == 0)
{
dup2(link[1], STDOUT_FILENO);
close(link[0]);
close(link[1]);
execvp("./exec", argv);
die("execl");
}
else
{
close(link[1]);
int nbytes = read(link[0], foo, sizeof(foo));
printf("Output: (%.*s)\n", nbytes, foo);
wait(NULL);
}
return 0;
}
exec.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
int main(int argc, char *argv[])
{
char a;
a='A';
write(link[1],&a,sizeof(a));
return 0;
}
我只是在练习,想输出从 pipe() 保存的数据
我做错了什么,你能帮我调试一下吗? TIA!
在 main.c
程序中,您通过子进程的标准输出连接管道。
这意味着子进程通过其正常的标准输出将信息传递给父进程。
由此可见,exec.c
程序可以像这样简单:
#include <stdio.h>
int main(void)
{
printf("A");
}
更具体地说,您的 exec.c
源文件不知道管道,绝对不知道变量 link
,并且将无法构建。