linux 关于文件读写的问题

linux 关于文件读写的问题,第1张

1. 文件write *** 作是原子的,多个进程同时写文件,原理上是没问题的。但是问题会出现在:如果多个进程写文件时是先lseek再write,就会出现覆盖。打开文件时使用append标志可以使先lseek再write这个 *** 作变成原子 *** 作,这样可以避免覆盖。

2. 多线程共享一个文件句柄的话,是不会有问题的。

3.

4.linux读写磁盘文件过程中,一般情况下并不是直接 *** 作磁盘上的文件,而是读写内存中的磁盘高速缓存,内核选择合适的时机把脏页同步到磁盘。所以读写文件时不立刻调用io不是因为你说的缓冲区,read和write是没有缓冲区的。

5. fprintf和printf一样,是有缓冲区的,不过大小我不知道,也没必要知道吧。

我来解决第四个问题吧,这是我写的串口通信的源码

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define PORT 5000 // The port which is communicate with server

#define LENGTH 256 // Buffer length

int main(int argc, char *argv[])

{

int sockfd // Socket file descriptor

int num // Counter of received bytes

char revbuf[LENGTH] // Receive buffer

struct sockaddr_in remote_addr // Host address information

/* Check parameters number */

if (argc != 2)

{

printf ("Usage: client HOST IP (ex: ./client 192.168.0.94).\n")

return (0)

}

/* Get the Socket file descriptor */

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

printf("ERROR: Failed to obtain Socket Descriptor!\n")

return (0)

}

/* Fill the socket address struct */

remote_addr.sin_family = AF_INET // Protocol Family

remote_addr.sin_port = htons(PORT)// Port number

inet_pton(AF_INET, argv[1], &remote_addr.sin_addr)// Net Address

bzero(&(remote_addr.sin_zero), 8) // Flush the rest of struct

/* Try to connect the remote */

if (connect(sockfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr)) == -1)

{

printf ("ERROR: Failed to connect to the host!\n")

return (0)

}

else

{

printf ("OK: Have connected to the %s\n",argv[1])

}

/* Try to connect the server */

while (strcmp(revbuf,"exit") != 0) // Check remoter command

{

bzero(revbuf,LENGTH)

num = recv(sockfd, revbuf, LENGTH, 0)

switch(num)

{

case -1:

printf("ERROR: Receive string error!\n")

close(sockfd)

return (0)

case 0:

close(sockfd)

return(0)

default:

printf ("OK: Receviced numbytes = %d\n", num)

break

}

revbuf[num] = '\0'

printf ("OK: Receviced string is: %s\n", revbuf)

}

close (sockfd)

return (0)

}

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/wait.h>

#include <sys/socket.h>

#define PORT 5000 // The port which is communicate with server

#define BACKLOG 10

#define LENGTH 512 // Buffer length

int main ()

{ int sockfd // Socket file descriptor

int nsockfd // New Socket file descriptor

int num

int sin_size // to store struct size

char sdbuf[LENGTH] // Send buffer

struct sockaddr_in addr_local

struct sockaddr_in addr_remote

char sendstr[16]= {"123456789 abcde"}

/* Get the Socket file descriptor */

if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )

{

printf ("ERROR: Failed to obtain Socket Despcritor.\n")

return (0)

}

else

{

printf ("OK: Obtain Socket Despcritor sucessfully.\n")

}

/* Fill the local socket address struct */

addr_local.sin_family = AF_INET // Protocol Family

addr_local.sin_port = htons(PORT)// Port number

addr_local.sin_addr.s_addr = INADDR_ANY // AutoFill local address

bzero(&(addr_local.sin_zero), 8) // Flush the rest of struct

/* Blind a special Port */

if( bind(sockfd, (struct sockaddr*)&addr_local, sizeof(struct sockaddr)) == -1 )

{

printf ("ERROR: Failed to bind Port %d.\n",PORT)

return (0)

}

else

{

printf("OK: Bind the Port %d sucessfully.\n",PORT)

}

/* Listen remote connect/calling */

if(listen(sockfd,BACKLOG) == -1)

{

printf ("ERROR: Failed to listen Port %d.\n", PORT)

return (0)

}

else

{

printf ("OK: Listening the Port %d sucessfully.\n", PORT)

}

while(1)

{

sin_size = sizeof(struct sockaddr_in)

/* Wait a connection, and obtain a new socket file despriptor for single connection */

if ((nsockfd = accept(sockfd, (struct sockaddr *)&addr_remote, &sin_size)) == -1)

{

printf ("ERROR: Obtain new Socket Despcritor error.\n")

continue

}

else

{

printf ("OK: Server has got connect from %s.\n", inet_ntoa(addr_remote.sin_addr))

}

/* Child process */

if(!fork())

{

printf("You can enter string, and press 'exit' to end the connect.\n")

while(strcmp(sdbuf,"exit") != 0)

{

scanf("%s", sdbuf)

if((num = send(nsockfd, sdbuf, strlen(sdbuf), 0)) == -1)

{

printf("ERROR: Failed to sent string.\n")

close(nsockfd)

exit(1)

}

printf("OK: Sent %d bytes sucessful, please enter again.\n", num)

}

}

close(nsockfd)

while(waitpid(-1, NULL, WNOHANG) >0)

}

}

server编译后在PC机上执行,client在板子上运行。

先启动server,再启动client

Usage: ./client HOST_IP (ex: ./client 192.168.0.94)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8306346.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存