Можно только сказать, содержит ли текущий поток нормальную блокировку ( Thread.holdsLock(Object)
). Вы не можете получить ссылку на поток, который имеет блокировку без собственного кода.
Однако при выполнении чего-либо сложного с поточной обработкой Вы, вероятно, хотите ознакомить себя с java.util.concurrent пакетами. ReentrantLock
действительно позволяет Вам получать его владельца (но это - защищенный метод, таким образом, необходимо было бы расширить это). В зависимости от Вашего приложения может случиться так, что при помощи пакетов параллелизма, Вы найдете, что не должны получать владельца блокировки, в конце концов.
существуют непрограммируемые методы для нахождения владельцев блокировки, таких как передача сигналов, чтобы о JVM выпустила дамп потока к stderr, которые полезны для определения причины мертвых блокировок.
< is a shell redirect - it is handled outside your program. What you'll see is the contents of the file name 'input' being send to your standard input stream. This is a common way for programs to operate, although they usually also handle being given a file name e.g. sed
.
If I had to guess I would think the:
input: No such file or directory.
is coming from the shell, as it is unable to open the file specified: "input".
On the other hand, if you actually want the < input
as arguments to your program, you can escape or quote them so the shell won't interpret them. (Escaping left as an exercise for the reader :-)).
On *nix systems, there won't be a third element of argv
. If you execute that command on almost any Unix-like shell, it will be similar to doing this:
cat input | ./program
So your ./program
has only one element in argv
, but it's stdin
is the file input
, so to read the file you would just read from stdin
. Note that this is a perfectly valid way to design your program. Many Unix programs read from standard input if no files are given, so that you may pipe in input from other programs (or in this case, from files).
Синтаксис ./ program - это специальный синтаксис оболочки, говорящий: «Перенаправляет все в файле с именем
input
в стандартную запись программы. ".
Чтобы прочитать ввод, ваша программа просто должна использовать стандартные функции чтения ввода, строку fgets
или scanf
.
То, что идет после <
, не является аргументом командной строки. Содержимое файла будет передано в вашу программу оболочкой.
Все, что вам нужно сделать, это прочитать из стандартного ввода, и вы получите содержимое файла.
This is a Unix shell thing. The form someprogram < somefile
tells someprogram to run using somefile as its input. If you want to do something different involving the <
symbol, you'll need to quote it.
Не ставьте знак «<». Вы хотите, чтобы аргументы командной строки делали это:
$ ./program -Dflag seven = ixnay FromDinger
В своем приложении попробуйте следующее:
int main( int argc, char **argv )
{
int i;
for( i = 0 ; i < argc ; ++i )
printf( "Arg %d = %s\n", i, argv[i] );
return 0;
}
Вы заметите, что первый аргумент - это имя исполняемого файла (в index 0), а вторым аргументом (с индексом 1) будет «-Dflag»
The <
means that the program will read it's standard input (stdin) from the named file (input). So just read from stdin (using fgets
, fread
, etc).
Вам нужно экранировать символ '<', иначе оболочка проанализирует его и программа не получит его в командной строке.
Если вы используете bash, то:
./program '<' input
или
./program \< input
Другие оболочки могут делать это иначе (например, по умолчанию Windows, cmd.exe
, использует ^
как escape-символ, а не \
).
Фактически, это очень распространенная техника, используемая в турнирах по программированию. Данные, необходимые вашей программе, хранятся в файле, скажем, data.txt, а затем перенаправляются в ваше приложение с помощью символа «<» в оболочке, например: ./ program < []