如何使用POPEN?(How to use popen?)

2019-10-23 02:48发布

我试图做的进程间通信stdinstdout 。 POSIX的功能,我发现是popen ,但我没写工作示例代码。 请帮我把这项工作。

<EDIT1>
我一定要使用dup ? 我可以看到与谷歌利用它发现了一些例子。 但Linux的手动dup真的没有帮助我了解如何使用它。
</ EDIT1>

AC

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    char *s;

    for(;;){
        scanf("%ms",&s);
        printf("%s\n",s);
        if(!strcmp(s,"quit")){
            free(s);
            printf("bye~\n");
            exit(EXIT_SUCCESS);
        }
        free(s);
    }
}

公元前

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    FILE *fRead;
    FILE *fWrite;
    char *s;
    int i;

    fRead=popen("~/a.out","r");
    fWrite=popen("~/a.out","w");
    for(i=1;i<=10;++i){
        fprintf(fWrite,"%d",i);
        fscanf(fRead,"%ms",&s);
        printf("%s\n",s);
        free(s);
    }
}

Answer 1:

如由POSIX定义,管道是单向通信机构 - 它们仅仅在一个方向工作。 为了既重定向标准输入和标准输出,你需要创建两个管道-和popen功能不能做到这一点。

虽然略低于方便,就不难通过直接使用系统调用来实现你想要的forkpipedup2exec

rc = pipe(p1);
if(rc < 0) ...
rc = pipe(p2);
if(rc < 0) ...

rc = fork();
if(rc < 0) {
    ...
} else if(rc == 0) {
    /* child */
    close(p1[0]);
    close(p2[1]);
    dup2(p1[1], 1);
    dup2(p2[0], 0);
    execlp(...);
    exit(1);
} else {
    /* parent */
    close(p1[1]);
    close(p2[0]);
    ...
}

还有其他的解决方案-您可以使用socketpair系统调用,以避免两个管道的需要,甚至可以直接使用的Unix域套接字。



文章来源: How to use popen?
标签: c pipe posix ipc