파일의 사용여부를 알수 있는 방법이 있나요??

zini08의 이미지

안녕하세요...
처음으로 글을 올려보는군요..^^

만약 소켓통신을 한다고 할때..
어떤 파일이 다 쓰인뒤에 그것을 전송을 할려고 합니다
그러니깐 다른 프로그램에서 쓰고 있는 도중에서는 그 열려진 정보를 알려주며..
접근을 막는거죠..
개념은 세마포어 비슷한데 자기 프로그램이 아닌 다른프로그램에서
그 파일을 열고 있는지 알려면...어떻게 해야 하나요??

pynoos의 이미지

fuser 를 사용하시면...

sunyzero의 이미지

fcntl에 보면 file lock에 대한 옵션이 있습니다. 이것을 사용하시면 됩니다.
(flock을 쓰셔도 상관은 없습니다.)

========================================
* The truth will set you free.

pynoos의 이미지

가끔 제가 헷소리할때가 있어요...

왜이러쥥...

잘 안읽고 답하는 나쁜 버릇..

up2soul의 이미지

Advanced Programming in the UNIX Environment 책에서 record lock 부분을 읽어보면
서로 다른 프로세스가 파일에 record lock하는 방법은 구현되어 있지 않다고 나와있습니다.
System V IPC같이 시스템 전역적인 방법으로 구현되지 않으면 안되는데
이런 방법은 제가 생각해도 여러 가지 문제가 많다고 생각합니다.

다만 사용하는 리눅스 커널이 /proc filesystem을 지원한다면 이 디렉토리를 검색해서
모니터링할 수는 있겠죠.

/proc/$PID/fd/ 디렉토리 안에 열려진 file descript 번호와 링크가 존재하니까요.

너 행복하니?

tifler의 이미지

윗분이 말씀하신데로
record locking을 쓰기 위해서는 같은 파일에 접근하고자 하는 프로세스들 모두가 record locking을 사용해야 합니다.

만약 그렇지 못하다면, record locking은 쓸모가 없게 됩니다.

예를 들어 다음과 같은 방법으로 간단히 테스트 해 볼 수 있습니다.

// 1.c
int main(int argc, char **argv)
{
	int fd;
	struct flock lock;

	fd = open(argv[1], O_RDWR);
	if(fd < 0)
	{
		printf("Error open : %s\n", argv[1]);
		return 0;
	}

	lock.l_type = F_WRLCK;
	lock.l_whence = SEEK_SET;
	lock.l_start = 0;
	lock.l_len = 0;

	if(fcntl(fd, F_SETLK, &lock) < 0)
	{
		printf("fcntl F_SETLK failed\n");
		close(fd);
	}
	else
	{
		printf("fcntl succeed. sleep...\n");
		while(1) sleep(10);
	}


	return 0;
}

// 2.c
int main(int argc, char **argv)
{
	int fd, cnt;
	char buf[4096];

	fd = open(argv[1], O_RDWR);
	if(fd < 0)
	{
		printf("Error open : %s\n", argv[1]);
		return 0;
	}

	while(1)
	{
		cnt = read(fd, buf, sizeof(buf));
		if(cnt < 0)
		{
			printf("Error on read\n");
			break;
		}
		if(cnt == 0)
		{
			printf("EOF\n");
			break;
		}
		printf("Read Bytes : %d\n", cnt);
	}


	close(fd);

	return 0;
}

1번을 실행한 후, 2번을 실행하게 되면 2번은 정상적으로 동작을 합니다.
1번에서는 lock을 걸었으나, 2번에서는 그 lock에대한 체크를 하지 않기 때문에
1번의 lock은 혼자만의 lock으로 여기에서는 쓸모가 없어지게 됩니다...

반대의 경우도 있을 수 있죠...

/***********************
* while(1) sleep(INFINITE);
***********************/

고물의 이미지

어떤 파일이 다 쓰인뒤에 그것을 전송을 할려고 합니다
---------------------        -------------------------------
         proc  1                              proc 2

프로세서가 다른데 순차적인 프로세싱을 할 경우에는..
proc 1의 프로세싱이 다 끝났다는 것을 proc2에 알려줘야??

알려주는 방법은...... 세마포어나 파일락에 관련된 것으로 할 경우에..
proc 1이 일어나지 않은채 proc2가 실행될 수 있으므로..
proc 1에서 프로세싱이 끝났다는 것을 proc 2에 알려주면 될 것 같네요.

방법은.. 새로운 파일을 생성하여 그 존재유무를 proc2에서 알게 하는것과.
파일 안에 프로세싱이 끝난 정보를 링크 리스트 형태로 저장한다던가
shared memory를 잡아서 링크 리스트 형태로 관리하거나..
직접 proc1에 socket을 넣어서....... 잡아오던가..
아니면....... proc 1과 proc2를 파이프로 연결을 해서 프로세싱이 끝났는지
확인하는 방법이 있는 것 같습니다.

체스맨의 이미지

그 다른 프로그램이 소스를 수정할 수 없는 프로그램이 아니라면,
그냥 프로세스 공유 세마포어(IPC)를 쓰면 될 것 같은데요.

Orion Project : http://orionids.org

Dr_stein의 이미지

만약에 그 프로그램이 소스를 수정할수 없다면 어떻게 해야할지 갑자기
궁금해 지네요....

앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;

moonzoo의 이미지

Quote:

그 프로그램이 소스를 수정할 수 없다면..

이게 무슨 뜻인죠? --;

위에 어느 분이 소스까지 자세히 올려주셨는데.

첫째로

모든 프로세스가 동일한 locking방법을 사용해서

일단 파일에 동시에 접근하는 일은 없어야 할테고..

둘째로 화일에 쓴 프로세스가 FIFO등에 한바이트 쓰면

기다리는 프로세스는 FIFO에서 읽고 바로 파일을 읽으러

가면 될듯 하네여..

moonzoo의 이미지

Quote:

그 프로그램이 소스를 수정할 수 없다면..

이게 무슨 뜻인죠? --;

위에 어느 분이 소스까지 자세히 올려주셨는데.

첫째로

모든 프로세스가 동일한 locking방법을 사용해서

일단 파일에 동시에 접근하는 일은 없어야 할테고..

둘째로 화일에 쓴 프로세스가 FIFO등에 한바이트 쓰면

기다리는 프로세스는 FIFO에서 읽고 바로 파일을 읽으러

가면 될듯 하네여..

Dr_stein의 이미지

파일에다가 쓰는 프로그램을 말한겁니다.
쓰는 프로그램은 소스를 고칠수 없을경우 어떻게 해야할지 궁금해 져서여..
-_-;;

앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.