I/O Redirection Operators
- Redirecting stadard output: >
- Usage: command > filename
- Redirects the standard output to a file rather than the screen
- Creates the new destination file
- if the file already exists, it will be overwritten with the data in the standard output
- 이미 내용이 있거나, 이미 존재하는 파일이라면 기존의 내용은 사라지고 새로운 내용을 덮어씁니다
- E.g., ls > foo.txt
- Causes the shell to load and execute ls program, with standard output redirected to disk file foo.txt
- Usage: command > filename
- Appending the standard output: >>
- Usage: command >> filename
- Appends the standard output to an existing file
- Instead of overwriting the file, the data in the standard output is added at the end of the file
- >과는 달리 새로운 내용을 기존의 내용 뒤에 붙여 작성합니다
- E.g., ls >> foo.txt
- Usage: command >> filename
- Redirecting the standard error: 2>, >&
- Linux distinguishes between standard output and error messages
- Error messages are placed in another standard byte stream called the standard error
- Error message는 일반적으로 화면으로 출력되기 때문에 standard output으로 출력되는 줄 알지만, Linux에서는 standard error를 통해서 화면에 출력됩니다
- Usage: command 2> filename
- The error message is redirected to the destination file
- Usage command >& filename
- Redirect both standard output and standard error to the same destination file
- >&는 stdout과 stderr의 출력을 모두 목적지 파일로 redirection하는 명령어 입니다
- Linux distinguishes between standard output and error messages
example
+ aaa와 bbb는 존재하지 않는 파일로, 만약 cat aaa나 cat bbb를 하면 stderr을 통해 error message가 출력됩니다.
+ cat aaa > err.txt의 결과로 error message가 화면에 출력되는 것은 >연산자를 사용했기 때문에 stderr를 redirection하지 못해서 입니다
+ 하지만 cat aaa >& err.txt의 결과는 화면에 출력되지 않습니다. >&는 stderr를 redirection하기 때문입니다.
+ 또한 cat bbb 2> err.txt했을때, err.txt에 적힌 내용이 aaa에 대한 error message가 없는 것은 append (>>) 하지 않기 때문입니다.
Duplicating File Descriptors
- int dup(int oldfd)
- Takes oldfd, an open file descriptor, and returns a new descriptor that refers to the same open file description
- The new descriptor is guaranteed to be the lowest unsued file descriptor
- oldfd와 같은 파일을 가르키는 새로운 file descriptor를 만들어서 return합니다. 이때 만들어지는 새로운 fd는 만들 수 있는 가장 낮은 번호의 fd입니다.
- Return value
- new file descriptor on success, or -1 on error
- Examples
- newfd = dup(1)
- dup() will create the duplicate of descriptor 1 using file 3
- fd 3번이 fd indecies들중 가장 낮은 번호임을 알 수 있습니다
- Assuming that the shell has opened file descriptors 0, 1, and 2 on the program's behalf, and no other descriptors are in use
- close(2); newfd = dup(1);
- If we want the duplicate to be descriptor 2
- 2번 fd를 사용하면 stdout(1)과 stderr(2)를 구분하지 않고 한 번에 사용할 수 있습니다.
- newfd = dup(1)
- Takes oldfd, an open file descriptor, and returns a new descriptor that refers to the same open file description
- int dup2(int oldfd, int newfd)
- Makes a duplicate of the file descriptor given in oldfd using the descriptor number supplied in newfd
- If the file descriptor specified in newfd is already open, dup2() closes it first
- 만약 newfd가 이미 사용중인 fd라면 dup2()는 그 fd를 먼저 close하고 dup2()에 의해 새롭게 할당합니다
- Return value
- New file descriptor on success, or -1 on error
- Example
- dup2(1, 2);
- same as close(2); new = dup(1);
- dup2(1, 2);
- Makes a duplicate of the file descriptor given in oldfd using the descriptor number supplied in newfd
Shared File Descriptor
in parent and child
in duplication
Example1
int main()
{
int fd1, fd2;
char c;
fd1 = open("test.txt", O_RDONLY);
fd2 = open("test.txt", O_RDONLY);
read(fd2, &c, 1);
read(fd1, &c, 1);
prnitf("c = %c\n", c);
return 0;
}
result
+ fd1과 fd2는 서로 다른 file offset을 갖고있기 때문에 이런 결과가 나온다.
Example2
int main()
{
int fd1, fd2;
char c;
fd1 = open("test.txt", O_RDONLY);
fd2 = open("test.txt", O_RDONLY);
read(fd2, &c, 1);
dup2(fd2, fd1);
read(fd1, &c, 1);
prnitf("c = %c\n", c);
return 0;
}
result
+ dup2()를 통해 fd2와 fd1의 file offset을 공유하게 할 수 있다.
Example3
int main()
{
write(1, "Hello\n", 6);
fprintf(stderr, "Bye\n");
return 0;
}
result
+ >과 2>, >&의 출력 부분에서의 차이점을 알 수 있는 예시입니다.
'[학교 수업] > [학교 수업] 시스템 프로그래밍' 카테고리의 다른 글
[시스템 프로그래밍] Time (1) | 2024.12.03 |
---|---|
[시스템 프로그래밍] Standard I/O Library (1) | 2024.11.28 |
[시스템 프로그래밍] Memory Mapped I/O (1) | 2024.11.24 |
[시스템 프로그래밍] Multiplexed I/O (0) | 2024.11.24 |
[시스템 프로그래밍] File Offset (0) | 2024.11.14 |