Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从管道中读取字符串_C_Linux_Fork - Fatal编程技术网

C 从管道中读取字符串

C 从管道中读取字符串,c,linux,fork,C,Linux,Fork,我有以下代码: int pfds[2], pid; if (socketpair(AF_UNIX, SOCK_STREAM, 0, pfds) < 0) { goto error; } if ((pid = fork()) == -1) goto error; if (pid == 0) { /* child */ close(pfds[1]); dup2(pfds[0], 1); close(pfds[0]); con

我有以下代码:

int pfds[2], pid;

if (socketpair(AF_UNIX, SOCK_STREAM, 0, pfds) < 0) {
        goto error;
}

if ((pid = fork()) == -1)
    goto error;

if (pid == 0) {
    /* child */
    close(pfds[1]);
    dup2(pfds[0], 1);
    close(pfds[0]);
    const char *argv[5];
    int i = 0;
    argv[i++] = "/bin/sh";
    argv[i++] = "/sbin/script.sh";
    argv[i++] = NULL;
    execvp(argv[0], (char **) argv);
    exit(ESRCH);
}
close(pfds[0]);
s.stream.string_data = true;
s.stream.notify_read = client_read_cb;
ustream_fd_init(&s, pfds[1]);
int-pfds[2],pid;
if(socketpair(AF_UNIX,SOCK_流,0,pfds)<0){
转到错误;
}
如果((pid=fork())=-1)
转到错误;
如果(pid==0){
/*孩子*/
关闭(pfds[1]);
dup2(pfds[0],1);
关闭(pfds[0]);
常量字符*argv[5];
int i=0;
argv[i++]=“/bin/sh”;
argv[i++]=“/sbin/script.sh”;
argv[i++]=NULL;
execvp(argv[0],(char**)argv);
退出(ESRCH);
}
关闭(pfds[0]);
s、 stream.string_data=true;
s、 stream.notify_read=客户端_read_cb;
ustream_fd_init(&s,pfds[1]);
脚本返回一个字符串(用
echo
命令打印),该字符串标记脚本加载结束


如何读取
/sbin/script.sh
返回的字符串?

基本上,您缺少执行execv的子进程和执行读取的父进程之间的区别:

char readbuffer[100];

if(pid == 0)
   ...
else
{
    close(pdfs[0];
    nbytes = read(pfds[1], readbuffer, sizeof(readbuffer));
}

但是,如果您只想等待脚本结束,您可以在子进程上执行wait_pid。

基本上,您缺少执行execv的子进程和执行读取的父进程之间的区别:

char readbuffer[100];

if(pid == 0)
   ...
else
{
    close(pdfs[0];
    nbytes = read(pfds[1], readbuffer, sizeof(readbuffer));
}
但是,如果您只想等待脚本的结束,您可以在子进程上执行wait_pid。

dup2(pfds[0],1)很奇怪。通常,您向管道的写入端写入,然后从读取端读取。(即,您希望看到
dup2(pfds[1],1)
dup2(pfds[0],1)很奇怪。通常,您向管道的写入端写入,然后从读取端读取。(即,您希望看到
dup2(pfds[1],1)