Обходчик страниц
Возможно ли реализовать скрипт, который по очереди будет проходить по заданным страницам? (и как?!)
Возможно ли реализовать скрипт, который по очереди будет проходить по заданным страницам? (и как?!)
Есть сайт, с которого нужно вытаскивать таблички. Но они не простые. Количество колонок меняется от 2 до 6. За это отвечает <select></select>. После смены значения - страница обновляется и становится нужное количество колонок.
Скопировал себе html-код страницы и попробовал
<script>
$("select[name='Date']").val(5)
$("select[name='Date']").trigger('onchange')
</script>
Что я сделал не так и как исправить?
В чем ошибка, код не работает. Хочу вывести по строкам(их 2), а для каждой строки вывести столбцы
<html>
<body>
<table>
<tr id="id01" class="BalanceRow clickedRow" style="text-align:left;display:table-row;" clickedrow="true">
<td class="BalNames0"><nobr><a style="text-decoration:none;color:black;cursor:pointer;" onclick="javascript:NewHideRows(['0101','0102','0103','010101','010102','010103','010104','010105','010201','010202','010203','010204','010205','010206','010207','010208','010301','010302','010303','010304','010305','010306','010307','010308','010309','010310','010311','010312','010313','010314','010315','010316','010317','010318','010319','01010101','01010102','01010103','01010104','01010201','01010202','01020101','01020102','01020103','01020105','01020106','01020107','01020201','01020202','01020203','01020204','01020205','01020206','01020207','01020208','01020209','01020210','01020301','01020302','01020303','01020304','01020305','01020306','01020307','01020401','01020402','01020403','01020404','01020405','01020406','01020407','01020501','01020506','01020507','01020508','01020509','01020801','01020802','01020803','01030201','01030202','01030203','01030204','01031401','01031402','0101010101','0101010102','0101010103','0101010104','0101010105','0101010106','0101010107','0102010201','0102010202','0102010203','0102010301','0102010302','0102010303','0102010501','0102020101','0102020102','0102020103','0102020104','0102020105','0102020106','0102020107','0102020108','0102020109','0102020110','0102020111','0102020201','0102020202','0102020203','0102020204','0102020205','0102020206','0102020207','0102020208','0102020301','0102020302','0102020303','0102020304','0102020305','0102030101','0102030102','0102030103','0102030104','0102030105','0102030201','0102030202','0102030203','0102030204','0102030205','0102030301','0102030302','0102030303','0102030304','0102030305','0102030401','0102030402','0102030403','0102030501','0102030502','0102030503','0102050101','0102050102','0102050103','0102050104','0102050105','0102050106','0102050601','0102050602'], 'picId01');"><img style="position:relative;top:-2px;" id="picId01" border="0" src="/img/TreeMinus.gif">
АКТИВ</a></nobr></td>
<td class="BalData0"><nobr><a id="01;1481;2018-01-01;" title="Нажмите для детализации по балансовым счетам 101 формы" href="#dialog" name="modal" data-toggle="modal" data-target=".balance-details-modal" style="text-decoration:none;color:black;">23 226 504 149</a></nobr></td>
<td class="BalData0"><nobr><a id="01;1481;2018-02-01;" title="Нажмите для детализации по балансовым счетам 101 формы" href="#dialog" name="modal" data-toggle="modal" data-target=".balance-details-modal" style="text-decoration:none;color:black;">22 883 569 886</a></nobr></td>
<td style="width:120px;border-left-style:solid;border-left-width:1px;border-left-color:#bbbbbb;" class="BalData0R"><nobr>-342 934 263</nobr></td>
<td style="width:70px;" class="BalData0R"><nobr>-1,5%</nobr></td>
<td><a style="cursor:pointer;" onclick="window.open('/pie_chart.php?type=pie&bank=1481&subtype=assets&d1=2018-01-01&d2=2018-02-01','График','width=850,height=500,scrollbars=yes')"><img src="/img/pie-chart-small.png" border="0"></a></td>
</tr>
<tr id="id0101" class="BalanceRow " style="text-align: left; display: table-row;">
<td class="BalNames1"><nobr><a style="text-decoration:none;color:black;cursor:pointer;" onclick="javascript:NewHideRows(['010101','010102','010103','010104','010105','01010101','01010102','01010103','01010104','01010201','01010202','0101010101','0101010102','0101010103','0101010104','0101010105','0101010106','0101010107'], 'picId0101');"><img style="position:relative;top:-2px;" id="picId0101" border="0" src="/img/TreeMinus.gif">
Высоколиквидные активы</a></nobr></td>
<td class="BalData1"><nobr><a id="0101;1481;2018-01-01;" title="Нажмите для детализации по балансовым счетам 101 формы" href="#dialog" name="modal" data-toggle="modal" data-target=".balance-details-modal" style="text-decoration:none;color:black;">1 727 507 996</a></nobr></td>
<td class="BalData1"><nobr><a id="0101;1481;2018-02-01;" title="Нажмите для детализации по балансовым счетам 101 формы" href="#dialog" name="modal" data-toggle="modal" data-target=".balance-details-modal" style="text-decoration:none;color:black;">1 513 795 738</a></nobr></td>
<td style="width:120px;border-left-style:solid;border-left-width:1px;border-left-color:#bbbbbb;" class="BalData1R"><nobr>-213 712 258</nobr></td>
<td style="width:70px;" class="BalData1R"><nobr>-12,4%</nobr></td>
<td><a style="cursor:pointer;" href="/visual/0101/na/1481-1-1/" target="_blank"><img src="/img/dot-chart.png" border="0"></a></td>
</tr>
</table>
<script>
(function() {
var jsonArr = [];
var obj = {};
var arrString = document.getElementsByTagName('tr').length; //
alert(arrString); // вывод количества строк
for(i=0;i<arrString;i++){
var CurrentString = document.getElementsByTagName('tr')[i].innerHTML;
var arrСolumn = CurrentString.getElementsByTagName('td').length; // для каждой строчки свое кол-во столбцов(тк некоторые строки различаются)
alert(CurrentString);
alert(arrСolumn);
for(j=0;j<arrСolumn;j++){
var CurrentColumn=CurrentString.getElementsByTagName('td')[j].innerText;
alert(CurrentColumn);
}
}
})();
</script>
</body>
</html>
В самом тэге есть еще куча разной инфы. Хочу вывести только «СЛОВО», но вместе с ним выводится и весь «мусор». Как решить проблему?
<html>
<body>
<table>
<tr id="id01" class="BalanceRow clickedRow" style="text-align:left;display:table-row;" clickedrow="true">
<td class="BalNames0"><nobr><a style="text-decoration:none;color:black;cursor:pointer;" onclick="javascript:NewHideRows(['0101','0102','0103','010101','010102','010103','010104','010105','010201','010202','010203','010204','010205','010206','010207','010208','010301','010302','010303','010304','010305','010306','010307','010308','010309','010310','010311','010312','010313','010314','010315','010316','010317','010318','010319','01010101','01010102','01010103','01010104','01010201','01010202','01020101','01020102','01020103','01020105','01020106','01020107','01020201','01020202','01020203','01020204','01020205','01020206','01020207','01020208','01020209','01020210','01020301','01020302','01020303','01020304','01020305','01020306','01020307','01020401','01020402','01020403','01020404','01020405','01020406','01020407','01020501','01020506','01020507','01020508','01020509','01020801','01020802','01020803','01030201','01030202','01030203','01030204','01031401','01031402','0101010101','0101010102','0101010103','0101010104','0101010105','0101010106','0101010107','0102010201','0102010202','0102010203','0102010301','0102010302','0102010303','0102010501','0102020101','0102020102','0102020103','0102020104','0102020105','0102020106','0102020107','0102020108','0102020109','0102020110','0102020111','0102020201','0102020202','0102020203','0102020204','0102020205','0102020206','0102020207','0102020208','0102020301','0102020302','0102020303','0102020304','0102020305','0102030101','0102030102','0102030103','0102030104','0102030105','0102030201','0102030202','0102030203','0102030204','0102030205','0102030301','0102030302','0102030303','0102030304','0102030305','0102030401','0102030402','0102030403','0102030501','0102030502','0102030503','0102050101','0102050102','0102050103','0102050104','0102050105','0102050106','0102050601','0102050602'], 'picId01');"><img style="position:relative;top:-2px;" id="picId01" border="0" src="/img/TreeMinus.gif">
СЛОВО</a></nobr></td>
</tr>
</table>
<script>
(function() {
var arrLength = document.getElementsByTagName('td').length;
alert(arrLength);
var head = document.getElementsByTagName('td')[0].innerHTML;
alert(head);
})();
</script>
</body>
</html>
Написал какое-то подобие чата(клиент-сервер). И остался один вопрос. Имеется возможность задавать имена клиентам
Но проблема в том, что два клинта могут взять одинаковые имена, а это не очень хорошо. Как сделать простенькую авторизацию без внешних файлов с логинами/паролями?
scanf("%s",name);
strcpy(me.name, name);
...
char temp[NAMELEN];
printf("Enter name: ");
scanf("%s",temp);
...
sendtouser(&me, temp, message)
Нагородил я конечно в той теме... Решил пересоздать, и все нормально сформулировать.
Нашел проблему, но не понимаю, как исправить. Сервер блокируется и ждет нового подключения. Клиенты не могут обмениваться сообщениями.
Как исправить эту проблему?
//sever.c
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<errno.h>
#include <string.h>
#include<unistd.h>
#include<stdlib.h>
void main(int argc,char **argv)
{
int flag=0;
int sockfd,newsockfd1,newsockfd2;
int n,k,m;
int client;
char line1[1000], line2[1000];
struct sockaddr_in servaddr,cliaddr;
if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){
perror(NULL);
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port = htons(51000);
servaddr.sin_addr.s_addr =htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){
perror(NULL);
close(sockfd);
exit(1);
}
if(listen(sockfd,8)<0){
perror(NULL);
close(sockfd);
exit(1);
}
while(1){{
client=sizeof(cliaddr);
if((newsockfd1=accept(sockfd,(struct sockaddr*)&cliaddr,&client))<0){
perror(NULL);
close(sockfd);
exit(1);
}
if((newsockfd2=accept(sockfd,(struct sockaddr*)&cliaddr,&client))<0){
perror(NULL);
close(sockfd);
exit(1);
}
if((n=read(newsockfd1,line1,999))>0){
if((n=write(newsockfd2,line1,strlen(line2)+1))<0)
{
perror(NULL);
close(sockfd);
close(newsockfd1);
close(newsockfd2);
exit(1);
}}
if((n=read(newsockfd2,line2,999))>0){
if((n=write(newsockfd1,line2,strlen(line2)+1))<0)
{
perror(NULL);
close(sockfd);
close(newsockfd1);
close(newsockfd2);
exit(1);
}}
}
if(n<0){
perror(NULL);
close(sockfd);
close(newsockfd1);
close(newsockfd2);
exit(1);
}
//close(newsockfd1);
//close(newsockfd2);
}
}
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include <string.h>
#include<unistd.h>
void main(int argc,char **argv)
{
int sockfd;
int n;
int i;
char sendline[1000],recvline[1000];
struct sockaddr_in servaddr;
if(argc!=2){
printf("Usage:a.out <IP address>\n");
exit(1);
}
bzero(sendline,1000);
bzero(recvline,1000);
if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){//AF or PF
perror(NULL);
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port = htons(51000);
if(inet_aton(argv[1],&servaddr.sin_addr) ==0){
printf("INvalid IP address\n");
close(sockfd);
exit(1);
}
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
perror(NULL);
close(sockfd);
exit(1);
}
for(i=0;i<3;i++){
printf("Message:\n");
fflush(stdin);
fgets(sendline,1000,stdin);
if((n=write(sockfd,sendline,strlen(sendline)+1))<0){
perror("Can\'t write \n");
close(sockfd);
exit(1);
}
if((n=read(sockfd,recvline,999))<0){
perror("Can\'t read \n");
close(sockfd);
exit(1);
}
printf("%s",recvline);
bzero(sendline,1000);
bzero(recvline,1000);
}
close(sockfd);
}
Создать собственный клиент быстрых сообщений (возможно, и сервер – зависит от выбранной архитектуры), который бы работали в рамках сети.
Как я понял, это что-то на подобии чата. Есть эхо-сервер. Хочу переделать его, возможно ли это? И как лучше сделать?
Эхо сервер такой: client.c
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <unistd.h>
#include <limits.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define PORT 1027
#define MAXLINE 256
#define SA struct sockaddr
/*
* Обработчик фатальных ошибок.
*/
void error(const char *s)
{
perror(s);
exit(-1);
}
/*
* Функции-обертки.
*/
int Socket(int domain, int type, int protocol)
{
int rc;
rc = socket(domain, type, protocol);
if(rc == -1) error("socket()");
return rc;
}
void Connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
{
int rc;
rc = connect(socket, addr, addrlen);
if(rc == -1) error("connect()");
}
void Close(int fd)
{
int rc;
for(;;) {
rc = close(fd);
if(!rc) break;
if(errno == EINTR) continue;
error("close()");
}
}
void Inet_aton(const char *str, struct in_addr *addr)
{
int rc;
rc = inet_aton(str, addr);
if(!rc) {
/* Функция inet_aton() не меняет errno в случае ошибки. Чтобы
сообщение, выводимое error(), было более осмысленным,
присваиваем errno значение EINVAL. */
errno = EINVAL;
error("inet_aton()");
}
}
int Select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout)
{
int rc;
for(;;) {
rc = select(n, readfds, writefds, exceptfds, timeout);
if(rc != -1) break;
if(rc == EINTR) continue;
error("select()");
}
return rc;
}
size_t Read(int fd, void *buf, size_t count)
{
ssize_t rc;
for(;;) {
rc = read(fd, buf, count);
if(rc != -1) break;
if(errno == EINTR) continue;
error("read()");
}
return rc;
}
size_t Write(int fd, const void *buf, size_t count)
{
ssize_t rc;
for(;;) {
rc = write(fd, buf, count);
if(rc != -1) break;
if(errno == EINTR) continue;
error("write()");
}
return rc;
}
/*
* Запись count байтов в сокет.
*/
size_t writen(int socket, const char *buf, size_t count)
{
const char *p;
size_t n, rc;
/* Проверить корректность переданных аргументов. */
if(buf == NULL) {
errno = EFAULT;
error("writen()");
}
p = buf;
n = count;
while(n) {
rc = Write(socket, p, n);
n -= rc;
p += rc;
}
return count;
}
void show_usage()
{
puts("Usage: client ip_address");
exit(-1);
}
void do_work(int socket)
{
int n;
fd_set readfds;
char s[MAXLINE];
ssize_t rc;
n = MAX(STDIN_FILENO, socket) + 1;
for(;;) {
/* Инициализировать набор дескрипторов. */
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds);
FD_SET(socket, &readfds);
Select(n, &readfds, NULL, NULL, NULL);
if(FD_ISSET(STDIN_FILENO, &readfds)) {
rc = Read(STDIN_FILENO, s, MAXLINE);
if(!rc) break;
writen(socket, s, rc);
}
if(FD_ISSET(socket, &readfds)) {
rc = Read(socket, s, MAXLINE);
if(!rc) break;
Write(STDOUT_FILENO, s, rc);
}
}
}
int main(int argc, char **argv)
{
int socket;
struct sockaddr_in servaddr;
if(argc != 2) show_usage();
socket = Socket(PF_INET, SOCK_STREAM, 0);
/* Инициализировать структуру адреса сокета. */
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
Inet_aton(argv[1], &servaddr.sin_addr);
Connect(socket, (SA *) &servaddr, sizeof(servaddr));
do_work(socket);
Close(socket);
return 0;
}
/*
* Конфигурация сервера.
*/
#define PORT 1027
#define BACKLOG 5
#define MAXLINE 256
#define SA struct sockaddr
/*
* Обработчик фатальных ошибок.
*/
void error(const char *s)
{
perror(s);
exit(-1);
}
/*
* Функции-обертки.
*/
int Socket(int domain, int type, int protocol)
{
int rc;
rc = socket(domain, type, protocol);
if(rc == -1) error("socket()");
return rc;
}
int Bind(int socket, struct sockaddr *addr, socklen_t addrlen)
{
int rc;
rc = bind(socket, addr, addrlen);
if(rc == -1) error("bind()");
return rc;
}
int Listen(int socket, int backlog)
{
int rc;
rc = listen(socket, backlog);
if(rc == -1) error("listen()");
return rc;
}
int Accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
{
int rc;
for(;;) {
rc = accept(socket, addr, addrlen);
if(rc != -1) break;
if(errno == EINTR || errno == ECONNABORTED) continue;
error("accept()");
}
return rc;
}
void Close(int fd)
{
int rc;
for(;;) {
rc = close(fd);
if(!rc) break;
if(errno == EINTR) continue;
error("close()");
}
}
size_t Read(int fd, void *buf, size_t count)
{
ssize_t rc;
for(;;) {
rc = read(fd, buf, count);
if(rc != -1) break;
if(errno == EINTR) continue;
error("read()");
}
return rc;
}
size_t Write(int fd, const void *buf, size_t count)
{
ssize_t rc;
for(;;) {
rc = write(fd, buf, count);
if(rc != -1) break;
if(errno == EINTR) continue;
error("write()");
}
return rc;
}
void *Malloc(size_t size)
{
void *rc;
rc = malloc(size);
if(rc == NULL) error("malloc()");
return rc;
}
void Pthread_create(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg)
{
int rc;
rc = pthread_create(thread, attr, start_routine, arg);
if(rc) {
errno = rc;
error("pthread_create()");
}
}
/*
* Чтение строки из сокета.
*/
size_t reads(int socket, char *s, size_t size)
{
char *p;
size_t n, rc;
/* Проверить корректность переданных аргументов. */
if(s == NULL) {
errno = EFAULT;
error("reads()");
}
if(!size) return 0;
p = s;
size--;
n = 0;
while(n < size) {
rc = Read(socket, p, 1);
if(rc == 0) break;
if(*p == '\n') {
p++;
n++;
break;
}
p++;
n++;
}
*p = 0;
return n;
}
/*
* Запись count байтов в сокет.
*/
size_t writen(int socket, const char *buf, size_t count)
{
const char *p;
size_t n, rc;
/* Проверить корректность переданных аргументов. */
if(buf == NULL) {
errno = EFAULT;
error("writen()");
}
p = buf;
n = count;
while(n) {
rc = Write(socket, p, n);
n -= rc;
p += rc;
}
return count;
}
void *serve_client(void *arg)
{
int socket;
char s[MAXLINE];
ssize_t rc;
/* Перевести поток в отсоединенное (detached) состояние. */
pthread_detach(pthread_self());
socket = *((int *) arg);
free(arg);
while((rc = reads(socket, s, MAXLINE)) > 0) {
if(writen(socket, s, rc) == -1) break;
}
Close(socket);
return NULL;
}
int main(void)
{
int lsocket; /* Дескриптор прослушиваемого сокета. */
int csocket; /* Дескриптор присоединенного сокета. */
struct sockaddr_in servaddr;
int *arg;
pthread_t thread;
/* Создать сокет. */
lsocket = Socket(PF_INET, SOCK_STREAM, 0);
/* Инициализировать структуру адреса сокета сервера. */
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
/* Связать сокет с локальным адресом протокола. */
Bind(lsocket, (SA *) &servaddr, sizeof(servaddr));
/* Преобразовать неприсоединенный сокет в пассивный. */
Listen(lsocket, BACKLOG);
for(;;) {
csocket = Accept(lsocket, NULL, 0);
arg = Malloc(sizeof(int));
*arg = csocket;
Pthread_create(&thread, NULL, serve_client, arg);
}
return 0;
}
Отправляю сообщения msg сначала в вектор
struct msg {
double clientId;
size_t cash;
char message[256];
};
struct msg quest2;
std::vector<msg> vector;
...
vector.push_back(quest2);
zmq_msg_t clientReq;
zmq_msg_init_size(&clientReq, sizeof(struct msg));
memcpy(zmq_msg_data(&clientReq), &quest2, sizeof(struct msg));
void* requester;
void* context;
context = zmq_ctx_new();
requester = zmq_socket(context, ZMQ_REQ);
int rc = zmq_connect(requester, "tcp://localhost:5555");
//После этого, их нужно отправить на сервер для выполнения
while(vector.size()>0){
zmq_msg_init_size(&clientReq, sizeof(struct msg));
memcpy(zmq_msg_data(&clientReq), &(vector.front()), sizeof(struct msg));
printf("sending %s\n", (vector.front()).message);
zmq_msg_send(&clientReq, requester, 0);
zmq_msg_close(&clientReq);
zmq_msg_init(&reply);
zmq_msg_recv(&reply, requester, 0);
size_t repSize = zmq_msg_size(&reply);
strcpy(ans, (char*)zmq_msg_data(&reply));
printf("Received: - %zu %s\n", repSize, ans);
if (strcmp(ans, "OK") == 0) {
printf("Operation went sucessfuly\n");
}
else if (strcmp(ans, "NOMN") == 0) {
printf("get some money\n");
}
else if (strcmp(ans, "NOFRND") == 0) {
printf("wrong user\n");
}
else if (strcmp(ans, "ERR") == 0) {
printf("some error\n");
exit(1);
}
else if (strncmp(ans, "ID", 2) == 0) {
sscanf(ans, "ID %lf CSH %zu", &friendId, &remCash);
printf("Your stats are: id - %lf\n cash amount - %zu\n", friendId, remCash);
}
else {
printf("hurr-durr-derp\n");
}
zmq_msg_close(&reply);
vector.erase(vector.begin());
//Но ans всегда возвращает OK, хотя при этом ничего не происходит. Если делать не для вектора, все работает номально.
Есть клиент-серверная программа - банк и клиент. Клиент может отправлять деньги, запрашивать сумму, проверять счет.
Как реализовать возможность временной приостановки работы сервера без выключения? Сообщения серверу можно отправлять, но ответы сервер не отправляет до возобновления работы.
Написал две сортировки для бинарного дерева. Однопоточная и многопоточная.(Сортировка меняет левое и правое поддерево)
b.sort();
b.sortParallel();
.
Как наглядно показать, что используется несколько потоков?
void Btree<T>::sort()
{
sortHelper(*this, false);
}
void Btree<T>::sortParallel()
{
sortHelper(*this, true);
}
void Btree<T>::sortHelper(Btree<T>& b, bool isParallel)
{
...
if (isParallel)
{
std::future<void> leftFu = sortParallelHelper(left);
std::future<void> rightFu = sortParallelHelper(right);
leftFu.get();
rightFu.get();
}
...
template <class T>
std::future<void> Btree<T>::sortParallelHelper(Btree<T>& q)
{
auto funcObj = std::bind(&Btree<T>::sortHelper, this, std::ref(q), true);
std::packaged_task<void()> task(funcObj);
std::future<void> res(task.get_future());
std::thread th(std::move(task));
th.detach();
return res;
}
Задача такая: В колоде(52 карты), рассчитать экспериментально (метод Монте-Карло) вероятность того, что сверху лежат две одинаковых карты. Количество раундов подается с ключом.
Создаю поток, в котором вызываю функцию generator, но она не выводит на экран 2 случайные карты. В чем может быть проблема?
#include <assert.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#define ARRAY_SIZE(a) (sizeof (a) / sizeof *(a))
#define COMPARE(a, b) (((a) > (b)) - ((a) < (b)))
const char RANKS[] = "23456789TJQKA";
const char SUITS[] = "SHDC"; /* Spades, Hearts, Diamonds, Clubs */
#define N_RANKS (13)
#define N_SUITS (4)
#define ERROR_CREATE_THREAD -11
#define ERROR_JOIN_THREAD -12
#define SUCCESS 0
typedef struct Card{
unsigned suit, rank;
} Card;
typedef Card Cards[52];
void init_cards(Cards *cards){
assert(cards != NULL);
Card *card = *cards;
unsigned suit;
unsigned rank;
for (suit = 0; suit < N_SUITS; ++suit)
for (rank = 0; rank < N_RANKS; ++rank)
{
card->suit = suit;
card->rank = rank;
++card;
}
assert(card == *cards + ARRAY_SIZE(*cards));
}
void shuffle_cards(Cards *cards, unsigned limit_size){
assert(cards != NULL);
assert(limit_size <= ARRAY_SIZE(*cards));
unsigned i;
for (i = 0; i < limit_size; ++i)
{
unsigned j = rand() % (ARRAY_SIZE(*cards) - i) + i;
Card temp = (*cards)[i];
(*cards)[i] = (*cards)[j];
(*cards)[j] = temp;
}
}
void print_cards(const Card cards[], unsigned n){
const Card *card;
const Card *card_end = cards + n;
for (card = cards; card != card_end; ++card)
printf("%c%c ", SUITS[card->suit], RANKS[card->rank]);
printf("\n");
}
/*int compare_cards(const Card cards[], unsigned n)
{
}*/
void* generator(void *args){
srand((unsigned) time(NULL));
Cards cards;
init_cards(&cards);
shuffle_cards(&cards, 2);
Card *player = cards;
print_cards(player, 2);
}
int main(int argc, char* argv[]){
int q,i,size,result;
pthread_t thread;
if (argc < 2){
printf("Please enter int\n");
return 1;
}
q=atoi(argv[2]);
printf("Q=%d\n",q);
result = pthread_create(&thread, NULL, generator, NULL);
if (result != 0) {
printf("main error: can't create thread, status = %d\n", result);
exit(ERROR_CREATE_THREAD);
}
}
Не так давно создавал тут тему. Про «Родительский процесс создает n дочерних процессов и передает им поочередно числа .Дочерний процесс при создании принимает имя файла. При работе дочерний процесс получает числа от родительского процесса и пишет их в файл.»
С чем-то помогли, с чем-то разобрался сам. Но в фаил почему-то не пишется. Предварительно создал Foo_N(N=1,2,3...).txt Что не правильно?
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void)
{
int status, n, q=0, result;
pid_t pid;
size_t i;
const size_t MAX_FILE_NAME = 100;
char file_name[MAX_FILE_NAME],somedata[10];
int data_processed, filepipes[2];
int PIP1[2];
printf("Сколько дочерних процессов создать?\n");
scanf("%d", &n);
pipe(PIP1);
// 0 read
// 1 write
printf("Enter string\n");
for(q=1;q<=n;q++){
snprintf(file_name, MAX_FILE_NAME, "Foo_%d.txt", q);
if ((pid = fork()) == -1){
exit(-1);}
if ((pid=fork()) != 0) {
//PARENT
close(PIP1[0]);//выход не нужен
dup2(PIP1[1], 0);//на вход stdin
printf("I send file name: %s\n", file_name);
waitpid(-1, &status, 0);
}
else {
//CHILD
close(PIP1[1]);
dup2(PIP[0],*file_name);
printf("I recv file name: %s\n", file_name);
break;
}
}
}
Задача такая: Родительский процесс создает n дочерних процессов и передает им поочередно числа из последовательности от 1...m.Дочерний процесс при создании принимает имя файла. При работе дочерний процесс получает числа от родительского процесса и пишет их в файл.
Не совсем понимаю как работает execve, Пытаюсь передать имя файла, но не получается.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
int main (void) {
int n;
int i=0;
int status;
char c;
printf("Сколько дочерних процессов создать?\n");
scanf("%d", &n);
pid_t p;
for(i=0;i<n;i++)
{
if (fork( ) != 0)
{
waitpid(-1, &status, 0);
}
else
{
char * program = "/home/user/file";
char * argv[] = {"/home/user/file","aux", NULL};
char * envp[] = {NULL};
int ret;
ret = execve(program, argv, envp);
exit(0);
}
}
}
Выставляю \parindent=1,2cm, но после окончания строчки, на новой, отступ сбрасывается.Есть ли похожие функции или придется делать с помощью абзацев? PS Львовского смотрел
параметры скрипта это $1=ключ(для режима защиты, может и не быть), $2=каталог $3=из какой кодировки $4=в какую. Скрипт зацикливается, а если поставить break после строки «while true; do» просто не работает. Не могу разобраться как довести до ума.
if [ $1 = "-p" ]
then key="1"; shift
else key="0"
fi
cd $1
find . -f ext3 -name '*.txt' -ls 2> /dev/null |
while read a ; do
if [ $key = "1" ]; then
while true; do
read -p "Are you sure to encode file" $a "[y/n] ?" yn
case $yn in
[Yy]* ) iconv -f $2 -t $3 $a -o $a;;
[Nn]* ) echo $a "-file wasn't encoded";;
* ) echo "Please answer yes or no.";;
esac
done
else
iconv -f $2 -t $3 $a -o $a
fi
done
fi