我在阅读管道时遇到了一些麻烦。不完全是。我读得很好,只是输出是全局的。
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int pfd[2];
int main(void)
{
pid_t pid;
int status;
char readbuf[1024];
int bytes_read = 0;
pipe(pfd);
switch((pid = fork())) {
case -1:
perror("fork");
break;
case 0:
/* child */
close(pfd[0]);
dup2(pfd[1], 1); /* stdout */
/* mkdir -p /home/edgar/testdir */
chdir("/home/edgar/testdir");
/* for file in a b c d e f g h i j k l m n o p q r s t u v w x y z;
* do
* touch $file
* done
*/
execl("/bin/ls", "ls", "-l", (char *)NULL);
exit(1);
default:
/* parent */
close(pfd[1]);
dup2(pfd[0], 0);
pid = wait(&status);
/* get input back from ls */
while ((bytes_read = read(pfd[0], readbuf, sizeof readbuf) > 0)) {
fprintf(stdout, "%s\n", readbuf);
}
printf("child exit status: %d\n", WEXITSTATUS(status));
}
return 0;
}
以下是全局输出的示例:
笔记本电脑$ ./test1
-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15你
-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 v
-rw-r - r-- 1edgaredgarp��
0 Jan 31 09:15 w -rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 x
-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 y
-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 z
1 edgar edgar 0 Jan 31 09:15 d
-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 e
它从a-v精细读取然后w-z很奇怪然后它从d开始。 为了便于阅读,我在上面添加了额外的换行符。
答案 0 :(得分:2)
C中关于字符串的最重要的事情之一是什么?他们意味着被 constraints host: 'api.project.dev' do
resources :statuses
root to: 'statuses#index', as: 'api_root'
end
constraints host: 'admin.api.project.dev' do
resources :statuses
root to: 'statuses#new'
end
终止了!
NUL
不会添加read
您的字符串 - 它会处理原始数据块,因此您必须自己执行此操作。这也意味着您无法传递缓冲区的完整大小,因为您需要为NUL
添加空间
NUL
答案 1 :(得分:0)
这似乎纠正了这个问题:
do {
bytes_read = read(pfd[0], readbuf, sizeof(readbuf));
readbuf[bytes_read] = '\0';
printf("%s", readbuf);
} while (bytes_read > 0);
感谢您的帮助。