2017-02-08 4 views
-2

Это то, что я сделал как часть простого экспериментирования;read() и write() не работают как ожидалось

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

int fun() 
{ 
int d=10; 
write(1,(int*)d,sizeof(d)); 
} 

int main() 
{ 
int x; 
fun(); 
read(1,(int*)x,4); 
printf("x=%d\n",x); 
return 0; 
} 

Как вы можете видеть, что я пытаюсь получить доступ к стоимости d в fun() функции через поток ввода-вывода (IO файлов) stdout; Я пробовал использовать stdin, но вещь x Значение не меняется. (Я попробовал в онлайн-среде IDE.) Но в соответствии с моим потоком мысли он должен измениться до значения d.

Может ли кто-нибудь помочь мне понять, почему это не так?

+0

Пожалуйста, покажите нам пример ввода и ожидаемого вывода. –

+0

Даже если вы исправите вызывающие последовательности (указатели прохода на 'read()' и 'write()'), вы не сможете прочитать, что пишет 'fun()'. Да, вы часто можете читать со стандартного вывода - но если вы не сделали что-то фантастическое (перенаправление ввода-вывода и т. Д.), Чтение со стандартного вывода такое же, как чтение со стандартного ввода, то есть он будет читать то, что вы вводите на клавиатуре , То, что вы написали на стандартный вывод, поступит на экран (если вы не сделали перенаправления ввода-вывода) и не станет частью входных данных. –

+0

@JonathanLeffler Как это сделать? –

ответ

3

читать и писать требуется указатели. В вашем случае это &d и &x. Литье int до int* обычно не имеет смысла.

1

Заменить строку:

write(1,(int*)d,sizeof(d)); 

с:

write(1, &d, sizeof(d)); 

и линии:

read(1,(int*)x,4); 

с:

read(1, &x, 4); 

Причина этой модификации:

Как вы можете видеть в this reference for read(), прототип функции read является:

ssize_t read(int fd, void *buf, size_t count); 

и, соответственно, прототип функции write является:

ssize_t write(int fd, const void *buf, size_t count); 

, как показано в this reference for write().

Следовательно, обе функции требуют указателя в качестве второго аргумента. Поэтому вы должны передать им адрес памяти.


Примечание: Вы пытаетесь сделать указатель из целое литья его int*. Фактически, int* указывает указатель в случае объявления или прототипа, но когда вы используете * перед именем переменной, оно указывает содержимое этой переменной. Символ & используется для указания адреса переменной.

2

Во-первых, правильный звонок read() и write() будет включать в себя получение указателя на вашу переменную и передачу его.

Во-вторых, вы читаете и пишите из stdout (дескриптор файла 1), в отличие от вашего описания. Это не имеет значения, если вы читаете из stdout вместо stdin, согласно https://stackoverflow.com/a/7680234/2543937

В-третьих, это лучше использовать unistd.h определения (STDOUT_FILENO, STDIN_FILENO и т.д.), вместо ФД чисел непосредственно.

int d, x; 
write(STDOUT_FILENO, &d, sizeof(d)); 
read(STDOUT_FILENO, &x, sizeof(x)); 
printf("x=%d\n", x); 

В связи с тем, что я думаю, что была ваша первая мысль: когда вы читаете из stdout (или stdin), данные поступают от ввода с клавиатуры, а не от того, что было напечатано на экране раньше - так значение d не должен доходить до x.

+1

спасибо за исправление, отредактировал ответ. другие ответы говорят только о «первой» точке моего ответа. есть также вторая, третья и попытка ответить на мою интерпретацию заданного вопроса –

+0

, который вы сейчас читаете из 'STDOUT_FILENO', может указывать на то, что один из них: D –

+0

, это то, что делает код в исходном вопросе, и это также то, что" вторая "точка моего ответа говорит о –