표준 입출력 binary 관련

wodnrrns의 이미지

안녕하세요.
제가 Mencoder를 이용해서 트랜스코더를 만들고, 스트리밍 서비스를 구현 중입니다.
다름이 아니라 트랜스코더에서 나오는 출력을 컨트롤 하고자 작업중인데요.

프로세스에서 표준 출력으로 나오는 정보를 읽어 바이트 단위로 확인하고 싶습니다.
현재 파일로 출력한 결과를 가지고 바이트 단위로 비교하는 작업은 잘되고 있는데요.
Mencoder에서 표준 출력으로 결과를 빼고 파이프로 (|) 제가 만든 모듈로 결과를 전달 하고 있습니다.
이때 비교 결과가 다르게 나오네요.

표준 출력을 binary로 받을 수는 없는것인지요.
tee를 사용해서 파일로 저장하고 읽을때 ("w+b") 옵션으로 읽어들이면 문제가 없는데

char in_data;

freed(&in_data,sizeof(char),1,stdin);

으로 받아들이면 안되네요.
표준 입력을 binary로 입력할 방법은 없을까요?

질문이 좀 두서없는것 같네요. 관련한 조그만 조언이라도 감사하겠습니다.

bushi의 이미지

[bushi@rose x86]$ cat t.c
#include <stdio.h>
int main(int argc, char **argv)
{
	FILE *f = argc > 1 ? fopen(argv[1], "wb") : stdin;
	char c;
	while (fread(&c, 1, 1, f) == 1) {
		if (fwrite(&c, 1, 1, stdout) != 1)
			break;
	}
	return 0;
}
[bushi@rose x86]$ 
[bushi@rose x86]$ gcc -o t t.c
[bushi@rose x86]$ 
[bushi@rose x86]$ 
[bushi@rose x86]$ dd if=/dev/urandom of=t1 bs=1024 count=4
4+0 records in
4+0 records out
4096 bytes (4.1 kB) copied, 0.000804879 s, 5.1 MB/s
[bushi@rose x86]$ 
[bushi@rose x86]$ ./t t1 > t2
[bushi@rose x86]$ cat t1 | ./t > t3
[bushi@rose x86]$ ./t < t1 > t4
[bushi@rose x86]$ 
[bushi@rose x86]$ md5sum t1 t2 t3 t4
d41d8cd98f00b204e9800998ecf8427e  t1
d41d8cd98f00b204e9800998ecf8427e  t2
d41d8cd98f00b204e9800998ecf8427e  t3
d41d8cd98f00b204e9800998ecf8427e  t4
[bushi@rose x86]$ 
[bushi@rose x86]$ sha1sum t1 t2 t3 t4
da39a3ee5e6b4b0d3255bfef95601890afd80709  t1
da39a3ee5e6b4b0d3255bfef95601890afd80709  t2
da39a3ee5e6b4b0d3255bfef95601890afd80709  t3
da39a3ee5e6b4b0d3255bfef95601890afd80709  t4
[bushi@rose x86]$

OTL

wodnrrns의 이미지

우선 답변해 주신 내용은 파일입력이건 표준입력이건 리다이렉션으로 연결할때 차이가 없다는걸 보여주신걸로 이해가 되는데요.
제가 이해한 내용이 맞는지요.
보여주신 결과대로라면 저역시 같은결과를 내야 하는데.. 제가 어떤부분에서 잘못 건드린 부분이 있는것 같습니다.
한번 더 확인해보고 결과를 올리겠습니다.

bushi의 이미지

stdout, stdin 에 혐의를 두긴 어렵지 않나 싶어서 적었습니다.

제 경험(http://kldp.org/node/95974#comment-451371)의 경우엔,
데이터를 뱉어내는 놈이 날래지 못해서...
데이타를 소비하는 놈의 속도를 못 따라가는 상황이었습니다.
pipe 로 연결하건 fifo 로 연결하건 마찬가지였습니다.
setvbuf 에 뭐뭐에 별걸 다 써봐도 안되길래 아 이건 네트웍이 느린 것이거나 내가 프로그램을 잘못 만들었다 싶은 생각이 들었고,
gprof 로 돌려보니 예상대로... select 를 위해 read fdset 을 매번 재구성하는 것이 병목이더군요.
고치고 나서도 상황은 별로 개선이 되지 않길래, 이건 필시 네떡 탓이다라고 결론 내리고 그냥 내팽겨쳤습니다.

OTL

pastime의 이미지

-	FILE *f = argc > 1 ? fopen(argv[1], "wb") : stdin;
+	FILE *f = argc > 1 ? fopen(argv[1], "rb") : stdin;
bushi의 이미지

질문하신 분이 "w+b" 로 여셨다길래 흉내냈습니다.

OTL

pastime의 이미지

그럼 일부러 잘못된 프로그램을 보여주신 것인가요?

"wb" 모드로 open하게 되면 fread() 자체가 불가능하고
"w+b" 모드로 open한다고 해도 그 순간 이미 입력 파일이 truncate되기 때문에 아무런 데이터를 읽을 수 없을텐데요..
(이건 "wb" 모드로 open할 때도 마찬가지이긴 합니다만..)

bushi의 이미지

일부러 잘못된 프로그램을 보이려한 것은 아닙니다,
말씀하신대로... 따라하다 똑같이 저지른 '버그'가 맞습니다.

OTL

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.